一、条件测试结构
1.if/then结构用来判断命令列表的退出状态码是否为0
if [ COMMAND ] then COMMAND else COMMAND fi
2.if命令能够测试任何命令,并不仅仅是中括号中的条件,比如
if grep -q Bash file then echo "File contains at least one occurrence of Bash." fi
3.一个if/then结构可以包含嵌套的比较操作和条件判断操作
#!/bin/bash # comparison='integer' a=2 b=3 if echo "Next *if* is part of the comparison for the first *if*." if [[ $comparison = "integer" ]] then (( a < b )) else [[ $a < $b ]] fi then echo '$a is less than $b' fi
4.else if和elif
5.[[ ]]与[ ]的比较:
(1)字符串比较中,[[ ]] 可以直接使用 > < 无需转义,[ ] 需要转义\>\<
(2)[ ] 中字符串或者${}变量尽量使用"" 双引号扩住,能避免值未定义引用而出错, [[ ]] 中字符串或者${}变量尽量如未使用"" 双引号扩住的话,会进行模式和元字符匹配。
(3)[[ 是bash程序语言的关键字,并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
(4)[[ 支持字符串的模式匹配,使用=~操作符时能支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真,[[ ]] 中匹配字符串或通配符,不需要引号。
(5)bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
6.(( ))结构:扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者是"假";而一个非零值的表达式所返回的退出状态码将为0,或者是"true"。
二、文件测试操作符
1.-e:文件存在就为真
2.-f:文件为普通文件就为真
3.-s:文件存在且文件大小不为0
4.-d:为目录就为真
5.-b:块设备文件就为真
6.-c:设备文件就为真
7.-p:管道文件就为真
8.-h:文件存在并且是符号链接就为真
9.-L:同-h
10.-S:socket文件就为真
11.-t:文件(描述符)被关联到一个终端设备上,一般被用来检测脚本中的stdin([ -t 0 ]) 或者stdout([ -t 1 ])是否来自于一个终端。
12.-r,-w,-x:文件是否具有可读,可写,可执行权限
13.-O:判断当前用户是否是文件的拥有者
14.-G:文件的group-id是否与当前用户相同
15.-N:从文件上一次被读取到现在为止, 文件是否被修改过
16.f1 -nt f2:文件f1比文件f2新就为真
17.f1 -ot f2:文件f1比文件f2旧就为真
18.f1 -ef f2:文件f1和文件f2是相同文件的硬链接
三、其他比较操作符
二元比较操作符
1.整数比较
(1)-eq:等于
(2)-ne:不等于
(3)-gt:大于
(4)-ge:大于等于
(5)-lt:小于
(6)-le:小于等于
(7)在双括号中使用:
(("$a" < "$b"))
(("$a" <= "$b"))
(("$a" > "$b"))
(("$a" >= "$b"))
2.字符串比较
(1)=:等于
(2)==:与=等价
(3)!=:不等于
(4)<,>:小于与大于,按照ASCII字符进行排序
if [[ "$a" < "$b" ]] if [[ "$a" > "$b" ]]
if [ "$a" \< "$b" ] if [ "$a" \> "$b" ]
(5)-z:字符串长度为零
(6)-n:字符串长度不为零
(注意:在一个混合测试中, 即便使用引用的字符串变量也可能还不够,如果$string为空的话, [ -n "$string" -o "$a" = "$b" ]可能会在某些版本的Bash中产生错误,安全的做法是附加一个额外的字符给可能的空变量,[ "x$string" != x -o "x$a" = "x$b" ] ("x"字符是可以相互抵消的))
参考《高级bash脚本编程指南》