Shell脚本(2)之条件测试和流程控制
条件测试:
test命令,作用:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数字,0真,非0假
语法:#test 测试条件
测试类型主要有:测试文件状态,字符串比较,整数值比较,逻辑测试
1.测试文件的状态:格式 #参数 文件或目录
参数:
-d 测试是否为目录 -e 测试目录或文件是否存在
-f 测试是否为文件 -r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写该文件
-L 测试是否为符号连接文件
-x 测试当前用户是否可执行该文件
Eg:#[ -d /etc ] &&echo “111”
2.整数值比较:格式 #[ 整数 操作符 整数]
操作符:
-eq 等于 -ne 不等于 -gt 大于
-lt 小于 -le 小于或等于 -ge 大于或等于
3.字符串比较:语法:[字符串1 参数 字符串2]
参数:
= 字符串内容相同,!表示相反
-z 字符串内容为空
4.逻辑测试:语法 :#[表达式1] 参数 [表达式2]
参数:
-a或&&:逻辑与,而且的意思,前后两个表达式都成立时整个测试结果才是真,否则为假
-0或||:逻辑或,或者的意思,操作符两边至少一个为真时,结果为真,否则结果为假
!:逻辑否,当指定的条件不成立,返回结果为真
条件判断if for case while
If结构:
其结构有三种:
①--单判断:注意,这种格式中当if和then在同行时,条件结尾必须有连着的分号。不在时,则没有
if ... ; then
commands
fi
不在同一行时:
if ...
then
commands
fi
②--双判断:
if ...; then
commands1
elseif ...; then
commands2
else
commands3
fi
③--多判断:三层及三层以上的判断,对前面的双判断进行扩展即可
Case结构
然,多种情况的处理可以使用if进行判断,但是,case使用起来处理效果更佳
①--case结构:注意,每行的末尾有空格,且以“;;”结尾
case $arg in
pattern | sample) commands ;;
pattern) commands ;;
1) commands1 ;;
2) commands2 ;;
*) commands3(default) ;;
esac
上面的pattern是选择的具体表达式:*代表任何字符;?代表任何字元;[abc]代表a、b、c中的任何一个;
[a-n]代表从a到n的任何一个字元;|代表多重选择
For结构:
①--for结构1:sequence格式
for arg in sequence(实际的变量序列,以空格分隔)
do
commands
done
②--for结构2:C语言格式
for((赋初值;条件;自增/自减))
do
commands
done
累加可以表示为i=$(($i+1))
while结构
while [条件]
do
commands
done
其中bread和continue和java等语言表示一样,都是分别表示break结束循环—不再循环;跳出本次循环,进行下次—继续循环
Shift,表示迁移,参数做迁移
Eg:
#!/bin/bash
#test.sh
#listen water
tot=0
while [$# -gt 0]
do
tot=$(($tot+$1))
shift
done
shell函数
在编写shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,即可成为函数,合理使用shell函数,可以使得脚本内容更加简介,增强程序的易读性,提高执行效率
定义新的函数
①--函数的定义如下:
[function] functionName()
action;
[return int;]
这里关于函数的定义中,关键字“function”可有可无,但是,一般地,建议写上
②--上述定义中,返回值也是可有可无,如果加的话,指定一个整数值n(0~255),如果不指定return语句,则以函数体中最后
一个语句的执行结果作为函数的返回值
③--return语句中,也可以使用临时的中间变量的,如“return $(($1+$2));”
④--承上,如果有“total=$(functionName3 2)”,并且打印“echo $total”,可以发现拿到的是空值,这是因为,一对括号中
中的那个函数调用,相当于一个命令,对于命令结果的获取,在shell中必须通过预置变量“$?”来获得。故而,上面的调用中,
可以在调用后紧接着使用“total=$?”来获取调用的结果
⑤--函数调用之前的变量是全局变量,在函数内部可以使用关键字local定义局部变量
⑥--函数名称可以与系统原有的命令名称一致,shell在解析时,会先在脚本中寻找,建议不要写成重名的
⑦--要想在函数中返回其他类型的结果时,可以设定一个全局变量,然后在函数中修改此变量,最后执行此函数时,就可以读出它了,
这是一种变通的返回值处理方法
⑧--函数在调用时的使用方式,类似于平常linux下面的命令处理方式,多个参数间用空格隔开,且函数名字后不要加括号