表示用bash这个解释器去解释下面的内容

shell脚本(一)基础知识,shell脚本基础知识

shell

一、简介

1.功效:与基础进行互相

2.语言类型:解释性语言,给基础解释用

3.脚本中率先行内容:

#!/bin/bash                      
这是shell脚本的第一行内容,表示用bash这么些解释器去解释上面包车型客车内容

#!/bin/sh                           
那也得以是shell脚本的率先行内容,表示用sh这几个解释器去解释上面包车型客车原委

#!/usr/bin/env bash       
env表示使用相对路线,自动找bash解释器所在地点。能够消除分裂版本的系统bash不一定在/usr/bin/bash那一个门路下的难点

4.为了使脚本方便别的人阅读,日常会在始发加上笔者、创立时间、邮箱、版本、描述等剧情,能够应用以下设置神速键的法子在剧本中扩充那一个音讯

vim /etc/vimrc

map <F4> ms:call WESTOS()<cr>’s
function WESTOS()
        call
append(0,”######################################”)
        call append(1,”# Author     :vaon                   #”)
        call append(2,”# Create
Date:”.strftime(“%Y-%m-%d”).”             #”)
        call append(3,”# Email     
:[email protected]        
#”)
        call append(4,”# Version    :1.0                    #”)
        call append(5,”# Description:                       #”)
        call
append(6,”######################################”)
        call append(7,”                          “)
        call append(8,”#!/usr/bin/env bash”)
endfunction

#map表示影射–>按F4时调用(呼叫)WESTOS函数

#0代表第一行,1次之行…

#风骚部分strftime是三个体系自带的函数,表示突显当前时光   .是分隔符,表示那些函数与其余两段内容互不影响

#下边是设定函数的法门:

    Fucton 函数名()

    内容

    Endfunction

接下来创制一个本子使用F4键就可以在本子最前方自动抬高以下内容:

二、基础知识

1.变量的宣示${a}b

设定a=1

echo $a 会出现1,

但echo $ab就不会产出1b,因为系统把ab当成四个变量了。

能够echo ${a}b,会现出1b,把作为二个已定义的1

2.转义、弱引用、强引用

1)\表示转义

echo ###不汇合世结果,不过加上 echo \#\#\#就能够现身###

2)“”表示弱援引,也得以出口###

3)‘’表示强援引,能够出口###

4)强援引和弱援引的区分

例如 $  !  \  “  那个强援用会把他们当做普通内容打字与印刷到荧屏上

而弱援用会把他们当成系统变量,推行变量里的剧情

还举例在弱援引中`hostname`意味着施行hostname命令

而在强援用中意味着输出`hostname`本条剧情

3.diff、patch

1)diff

【1】.

[[email protected]
mnt]# cat file1
abcd
1234
[[email protected]
mnt]# cat file2
abcd
[[email protected]
mnt]# diff file1 file2
2d1
< 1234
#表示file1删除1234就和file2一样了

【2】.相比目录

diff -r 目录一 目录二

2)打补丁

建立hello文件:

vim hello

westos

建立hello.new文件:

vim hello.new

westos

456

设置自动更新工具包:

yum install patch -y

将hello.new与hello文件相比较,多出的剧情做成hello.path补丁包:

diff -u hello hello.new > hello.path

用path补丁包去更新hello文件:

patch hello hello.path

翻开hello文件,已经被更新成和hello.new同样了:

cat hello

westos

456

注:如若patch后边加上-b参数表示在创新的还要备份原版的书文件为hello.orig

4.grep

率先创造二个文件:

[[email protected]
mnt]# vim /mnt/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
test:ROOT:test
test:test:root
test:root:test
test:roottest:test

1)查找包罗root子段的行

[[email protected]
mnt]# grep root /mnt/passwd
root:x:0:0:root:/root:/bin/bash
test:test:root
test:root:test
test:roottest:test

2)查找包蕴root子段的行,不区分轻重缓急写

[[email protected]
mnt]# grep -i root /mnt/passwd
root:x:0:0:root:/root:/bin/bash
test:ROOT:test
test:test:root
test:root:test
test:roottest:test

3)只要root开头的

[[email protected]
mnt]# grep -i ^root /mnt/passwd
root:x:0:0:root:/root:/bin/bash

4)只要root结尾的

[[email protected]
mnt]# grep -i root$ /mnt/passwd
test:test:root

5)以root伊始和结尾的行都不要。-E表示前面多个标准还要筛选,-v代表不要筛选出的行

[[email protected]
mnt]# grep -i root /mnt/passwd|grep -i -E “^root|root$” -v
test:ROOT:test
test:root:test
test:roottest:test

6)表示一旦包罗独有root子段的行,root前后只要有字母都不用,如roottest那行就不要

[[email protected]
mnt]# grep -i “\<root\>” /mnt/passwd|grep -i -E “^root|root$”
-v
test:ROOT:test
test:root:test
问题:

翻开全数能登入系统的客商

解答:

[[email protected]
mnt]# grep “\<bash\>” /etc/passwd
root:x:0:0:root:/root:/bin/bash
可见独有root能登录
7)grep -n 代表突显找出出的字符串所在行号

[[email protected]
mnt]# grep -n hello /mnt/passwd
4:hello

8)gep -n2
表示突显搜索出的行以及它的地点2行和下部2行,并且展现各自在文件中的行号

注:假使-n和2里头有空格则意味除了下边呈现的原委还有可能会在每行开始展现出文件名

[[email protected]
mnt]# grep -n2 hello /mnt/passwd
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:hello
5-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
6-games:x:12:100:games:/usr/games:/sbin/nologin

9)grep -B2 表示显示搜索出的行以及那行的上两行内容
[[email protected]
mnt]# grep -B2 hello /mnt/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
10)grep -A2 表示下两行

[[email protected]
mnt]# grep -A2 hello /mnt/passwd
hello
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
11)表示搜索/mnt目录下蕴涵root字符的文本
[[email protected]
mnt]# grep -r hello /mnt/
/mnt/passwd:hello

5.cut

用法:cut -d 分隔符 -f 第几列 文件

-c钦赐字符

-d钦赐分隔符

-f钦定第几列

cut -d : -f 2 /mnt/psswd     #以:为分隔符,显示passwd文件第二列

cut -d : -f 2,7 /mnt/psswd   #,表示第二和第七列,借使是-表示2到第7列

cut -c 3 /mnt/passwd      #显示第三列的字符,不接纳分隔符

cut -c 1,3 /mnt/passwd     #显示一和三列的字符,不使用分隔符

题目:

显示eth0网卡的ip

解答:

[[email protected]
mnt]# ifconfig eth0|grep “\<inet\>”|cut -d ” ” -f 10
172.25.254.1

6.awk

-v代表给变量赋予内容:

[[email protected]
mnt]# name=hello
[[email protected]
mnt]# awk -F : -v name=$name ‘BEGIN {print name} {print $1}END {print
“end”}’ /mnt/passwd
hello
root
bin
daemon
hello
mail
games
test
test
test
test
end
7.sed

-i      #本条参数表示写入文件

sed ‘s/old/new/g’ passwd       #将passwd文件中的全数old字符替换为new

sed ‘s/old/new/g’ passwd       #将passwd文件中的全数old字符替换为new,并写入passwd文件

sed ‘2,5s/old/new/g’ passwd      #替换2到5行

sed ‘/adm/,/gdm/s/old/new/g’ passwd   #从adm字符一贯到gdm字符的剧情中将old替换为new

sed -e ‘s/old/new/g’ -e ‘s/old1/new1/g’ passwd  
#将old替换为new同时将old1替换为new1

sed 5d passwd    #删除第5行

sed 5p passwd    #复制第5行

sed -n 5p passwd    #只呈现第5行

-p    #表示平昔将 sed 的动作写在多少个档案内, -f filename 则足以实施filename 内的sed 动作

vim file

s/sbin/westos/g
s/nologin/linux/g

sed -f file passwd

题目:

将httpd服务端口改为8080

解答:

############################
# Author     :vaon                           #
# Create Date:2017-12-16             #
# Email     
:[email protected]      
#
############################

#!/bin/bash
PORT=`grep ^Listen /etc/httpd/conf/httpd.conf`
sed “s/$PORT/Listen $1/g” -i /etc/httpd/conf/httpd.conf
systemctl restart httpd

8.设置变量

1)有时设置(遭受级)

在当前境况生效,当前意况关闭,变量失效

先看一个例子:

[[email protected]
mnt]# a=1
[[email protected]
mnt]# echo $a
1
[[email protected]
mnt]# vim test.sh
#!/bin/bash
echo $a
[[email protected]
mnt]# sh test.sh 

[[email protected]
mnt]#

#由于a=1是在近些日子应用的shell里面赋的值,当进入脚本实践时,脚本使用的是子shell,那么些子shell中并未设定a=1,所以结果为空

[[email protected]
mnt]# export a=1
[[email protected]
mnt]# sh test.sh
1

#能够一时设定a=1给持有shell,一旦登出就能够遗失这一个有的时候设定

2)永世设置

【1】.系统级

对富有顾客生效

[[email protected]
mnt]# vim /etc/profile

export a=1

[[email protected]
mnt]# source /etc/profile

[[email protected]
mnt]# logout
Connection to 172.25.254.1 closed.
[[email protected]
Desktop]# ssh
[email protected]
[email protected]’s
password:
Last login: Sat Dec 16 09:12:16 2017 from 172.25.254.10
[[email protected]
~]# cd /mnt/
[[email protected]
mnt]# sh test.sh
1

#那样全体shell都能够动用a=1那个变量,登出种类再登录仍旧留存a=1

【2】.用户级

只针对配置过的客商生效,其他顾客不可能运用

vim /root/.bash_profile

export a=1

source /root/.bash_profile

以往a=1只对root客商生效

9.将脚本加到系统命令中去
[[email protected]
mnt]# vim /etc/profile

export PATH=$PATH:/mnt

注:这里一样存在系统级或客户级的安装,在此地运用的是系统级设置。假若只同意root能够安装/root/.bash_profile文件

[[email protected]
mnt]# source /etc/profile

[[email protected]
mnt]# chmod +x test.sh 

接下来退出/mnt目录,直接把test.sh脚本当成系统命令去推行,开掘也能够:

[[email protected]
mnt]# cd
[[email protected]
~]# test.sh
1
10.命令别名

1)使用小名

[[email protected]
~]# vim /etc/bashrc
alias kan=’cat’             #意味着实施’kan’的时候一定于施行’cat’命令

[[email protected]
~]# source /etc/bashrc

查阅外号列表:

[[email protected]
~]# alias

         …

alias kan=’cat’

         …

实践kan那么些单词就也正是实践cat命令

[[email protected]
~]# kan /mnt/test.sh
######################################
# Author     :vaon                   #
# Create Date:2017-12-16             #
# Email     
:[email protected]        
#
######################################
                          
#!/bin/bash
echo $a
2)删除别称
删除/etc/bashrc中的alias kan=’cat’

然后在剔除kan新闻:

unalias kan

近年来查看alias列表,里面早就远非kan的新闻了

11.*和@区别

vim test.sh

#!/bin/bash
echo ‘$1 Is’ $1
echo ‘$2 Is’ $2
echo ‘$3 Is’ $3
echo ‘$* Is’ $*
echo ‘$# Is’ $#
echo
‘[email protected]
Is’
[email protected]
[[email protected]
mnt]# sh test.sh 1 2 3
$1 Is 1                                                  
#显示第1个字符
$2 Is 2                                                  
#显示第1个字符
$3 Is 3                                                  
#显示第1个字符
$* Is 1 2 3                                            
#来得全体字符
$# Is 3                                                  
#体现最后三个字符
[email protected]
Is 1 2 3                                           #来得全数字符
*和@都表示全部剧情,但实则多少个是兼备内容方到“”里面。而@是各种数据都加引号

$*   “1 2 3”

&@  “1” “2” “3”

12.shell脚本中等学校函授数的概念

READ()

{

        echo hello word

}

13.变量比较

1)test

2)[ ]

[[email protected]
mnt]# a=1
[[email protected]
mnt]# b=1
[[email protected]
mnt]# test “$a” == “$b” && echo yes || echo no
yes
[[email protected]
mnt]# [ “$a” == “$b” ] && echo yes || echo no
yes
3)[ 条件1 -a 条件2 ] 表示原则1和2都满意
4)[ 条件1 -o 条件2 ] 表示原则1和2任三个餍足

5)[ 条件1 -eq 条件2 ]  等于

6)[ 条件1 -ne 条件2 ]  不等于

7)[ 条件1 -gt 条件2 ]  大于

8)[ 条件1 -ge 条件2 ]  大于等于

9)[ 条件1 -lt 条件2 ]  小于

10)[ 条件1 -le 条件2 ]  小于等于

[[email protected]
mnt]# [ “$a” -eq “$b” ] && echo yes || echo no
yes

11)[ -n ]   变量内容不为空

12)[ -z ]    变量内容为空

[[email protected]
mnt]# a=8
[[email protected]
mnt]# [ -n “$a” ] && echo yes || echo no
yes
[[email protected]
mnt]# [ -z “$a” ] && echo yes || echo no
no

13)[ -b ]  是或不是为块设备文件

14)[ -c ]  是还是不是为字符设备文件

[[email protected]
mnt]# [ -b /dev/sda ] && echo yes || echo no
yes
[[email protected]
mnt]# [ -c /dev/vfio/vfio ] && echo yes || echo no
yes

15)[ -f ]  是不是为不荒谬文件

16)[ -S ]  是还是不是为套接字文件

17)[ -L  ]  是或不是为链接文件

18)[ -d ]  是还是不是为目录

19)[ -e ] 文件是不是存在

20)[ -r ]  是不是可读

21)[ -w ]  是还是不是可写

22)[ -x ]  是或不是可实行

18)[ filename1 -nt filename2 ] 
如果 filename1 比 filename2 新,则为真

19)[ filename1 -ot filename2 ] 
如果 filename1 比 filename2 旧,则为真

[[email protected]
mnt]# touch file
[[email protected]
mnt]# [ /mnt/check_ip -ot file ] && echo yes || echo no
yes

题目:

彰显输入的文件类型

解答:

#!/bin/bash
[ -e $1 ] && (
        [ -f $1 ] && echo “$1 Is File”
        [ -d $1 ] && echo “$1 Is Directory”
        [ -b $1 ] && echo “$1 Is Block File”
        [ -L $1 ] && echo “$1 Is Link”
        [ -S $1 ] && echo “$1 Is Socket”
)
14.四则运算

15.语句

case语句:
并发的去相称全体法则,全体法则同不平日候去安顿,功能比if语句高

if语句是逐行去匹配,第一行不包容再去相配下一行,功效好低

exit 退出脚本。前面加数字1|0则象征退出后$?的值为1|0

break 退出循环

相关文章