Shell流程控制与函数
# IF判断语法
用于判断条件返回值是否为0,如果为0则表示条件成立。
# 单分支结构
如果条件成立则命令 ,否则不执行命令。
if [ 条件判断条件 ];then [命令] ... ... fi
1
2
3
4
# 双分支结构
如果条件成立则执行命令1,否则执行命令2。一条if语句中else最多只能有1个。
if [ 条件判断条件 ];then [命令1] else [命令2] fi
1
2
3
4
5
# 多分支结构
如果条件1成立则执行命令1,否则判断条件2。一条if语句中elif可有多个。
if [ 条件判断条件1 ];then [命令1] elif [ 条件判断条件2 ];then [命令2] fi
1
2
3
4
5
# 条件判断语句
条件判断格式:
[ 判断条件 ]
,例如:[ $? -eq 0 ]
成立则为真,返回0,不成立则为假,则返回非0。为真则表示满足条件,将会执行命令。
条件判断语句也可直接单独使用,但不如配合IF语句直观,例如:
# 如果$test -eq 123条件成立,则执行echo "yes",否则执行echo "no" [ $test -eq 123 ] && echo "yes" || echo "no" # 同等于 if [ $test -eq 123 ];then echo "yes" else echo "no" fi
1
2
3
4
5
6
7
8
9
取相反结果
!
- 判断结果取反- 将比较符意义取相反即可。也就是如果判断结果成立则取假,如果判断结果不成立则取真。
- 例子:
[ ! $test -eq 123 ]
数值比较
进行数值判断时使用,使用例子:
[ $test -eq 123 ]
。-eq
- 等于则为真-ne
- 不等于则为真-gt
- 大于则为真-lt
- 小于则为真-ge
- 大于等于则为真-le
- 小于等于则为真字符串比较
- 比较字符串,字符串和变量都必须加双引号,不然可能无法正常判断,使用例子:
[ $mystr == "233" ]
、[ -z "$test" ]
。 ==
- 等于则为真!=
- 不等于则为真-z
- 变量没有内容则为真-n
- 变量有内容则为真
- 比较字符串,字符串和变量都必须加双引号,不然可能无法正常判断,使用例子:
文件比较
- 比较文件,对指定路径的文件进行条件判断,使用例子:
[ -f /etc/hosts ]
-e
- 如果文件或目录存在则为真-d
- 如果文件存在且为目录则为真-s
- 如果文件存在且不为空则为真- 可用于删除没用的空文件,节省inode空间。
-r
- 如果文件存在且有读权限则为真-w
- 如果文件存在且有写权限则为真-x
- 如果文件存在且有执行权限则为真
- 比较文件,对指定路径的文件进行条件判断,使用例子:
多条件逻辑比较
- 使用
[]
时 可以使用-a
和-o
来进行逻辑判断。-a
- 并且,例如:[ 1 -ne 2 -a 2 -eq 2 ]
-o
- 或者,例如:[ 1 -eq 2 -o 2 -eq 2 ]
- 使用
[[]]
时,可以使用逻辑比较符号进行比较。&&
- 并且,例如:[[ 1 -ne 2 && 2 -eq 2 ]]
||
- 或者,例如:[[ 1 -eq 2 || 2 -eq 2 ]]
=~
- 正则等于匹配,例如:[[ $USER =~ ^roo ]]
- 如果匹配成功则为真。
- 也可以在
[]
之外使用逻辑比较符。&&
- 并且,例如:[ 1 -eq 1 ] && [ 2 -eq 2 ]
||
- 或者,例如:[ 1 -eq 3 ] || [ 2 -eq 2 ]
- 使用
判断命令返回值
一般通过
$?
变量判断即可,例如:echo "test" if [ $? -eq 0 ];then ... ...
1
2
3
# CASE判断语法
如果$变量的值与指定值相等,则会执行其中的命令。
# 格式 case $变量 in 匹配条件1) [命令] ;; 匹配条件2) [命令] ;; 匹配条件...) [命令] ;; *) [无匹配则执行的命令] esac # 例子 case $test in 1) echo "你输入的是test" b|break|q) echo "你输入的是b或break或q ;; [2-9]) echo "你输入的是2-9" ;; test) echo "你输入的是test" ;; *) echo "请不要随便输入" esac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# FOR循环语法
# 一般写法
将迭代对象赋值给变量进行循环,直到全部迭代完。
# 格式 for [变量名] in [迭代对象] do echo $变量 ... ... done # 例子 for $i in $(cat /etc/hosts);do echo $i done
1
2
3
4
5
6
7
8
9
10
11取值方法
# 从序列中取值 for i in {01..09};do echo $i done # 从变量中取值 test="test1 test2" for i in $test;do echo $i done # 从文件中取值(命令取值) for $i in $(cat /etc/hosts);do echo $i done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16自定义分隔符
- for循环默认按空白符作为分隔符,也就是:
空格、制表\t、换行\n、回车换行\r\n
。
# 我们可以通过修改IFS变量来自定义分隔符 IFS="[分隔符]" # 例如: # 以冒号、分号、双引号分隔 IFS=:;" # 以换行符分隔 IFS=$'\n'
1
2
3
4
5
6
7
8- for循环默认按空白符作为分隔符,也就是:
# C语言风格写法
可以实现自增、自减的for循环,当然也可以自己写自增自减命令。
# 格式 for ((初始条件;判断条件;每次循环结束执行的操作)) do ... ... done # 例子 for ((a=1,b=9;a<10;a++,b-=1));do echo "$a and $b" done
1
2
3
4
5
6
7
8
9
10
# FOR循环并发执行
将循环体的命令,使用
{} &
包起来即可,可防止串行循环的过程太长。# 使用例子 for i in {1..50};do { echo $i } & done
1
2
3
4
5
6另外因为是同时执行,所以输出屏幕顺序可能会不一致。如果要在循环结束后,输出屏幕信息,需要添加wait命令,等待前台进程结束再往后执行。
# 流程控制语句
exit
- 结束整个程序break
- 跳出当前循环continue
- 跳过本次循环,进入下次循环
# WHILE循环语法
如果条件为真,则会一直循环,只有当条件为假或者break命令,才会跳出循环。
# 格式 while [条件] do 循环体(命令) done # 例子 i=10 while [ $i -ge 0 ];do echo "$i" let i-- done
1
2
3
4
5
6
7
8
9
10
11
12迭代文件内容
# 格式 while read [变量名] do 循环体(命令) done<[文件路径] # 例子 while read var do echo $var done</tmp/test.txt
1
2
3
4
5
6
7
8
9
10
11
# SHELL函数
# 函数介绍
- 函数就是一堆命令的集合,来完成特定功能的代码块。
- 定义函数相当于定义一个命令或则说脚本,并且可以在脚本中任何位置调用。
- 使用函数可以使代码模块化,方便代码的复用,提高脚本的可读性。
# 定义Shell函数
函数需要先定义,才能调用
# 格式:另外关键字function可以省略 function 函数名(){ 函数体(命令) ... ... } # 例子 test(){ echo "test" }
1
2
3
4
5
6
7
8
9
10
# Shell函数传参
位置传参
# 函数的位置传参也同脚本一样,如$n、$#、$?等等。 test(){ echo "$1" } test "echo输出" # 脚本的位置参数和函数位置参数是隔离的,如果函数要使用脚本的位置参数,则需要传给函数才能调用 test(){ echo "$1" } test $1
1
2
3
4
5
6
7
8
9
10
11变量传参
# 脚本定义的变量,函数可以直接调用 test(){ echo "$Num"; } Num=100 test # 函数内定义的变量,调用函数后,脚本也可以调用 test(){ Num=100; } test echo $Num
1
2
3
4
5
6
7
8
9
# 调用Shell函数
直接像命令一样输入函数名即可,也可以将函数作为命令一样,获取屏幕输出给变量。
# 调用test函数 test # 调用test函数,并获取标准输出作为res变量的值 res = $(test)
1
2
3
4
5
# Shell函数返回值
将函数的运行状态或结果返回到脚本。
使用return返回值
- return只能返回1-255的整数,调用return后函数会立即结束并返回结果,需要通过$?获取。
- 通常用来供调用后获取函数执行状态:0表示成功,1表示失败。
test(){ return 0 } test echo $?
1
2
3
4
5使用echo返回值
可以返回任何字符串结果,通常用来返回数据结果,如一个字符串或者列表值。
test(){ echo "test" } result=$(test) echo $result
1
2
3
4
5