Bash里用作条件判断的有test命令,各种中括号和圆括号操作,和if/then结构。
if/then结构用来判断命令列表的退出状态码是否为0(0表示成功),如果成功,那么就执行接下来的一个或多个命令。
“[”中括号是一个专有命令,这个命令与test命令等价,并且处于效率上的考虑,这是一个内建命令。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码(0表示真,1表示假)。
版本2.02之后,引入了[[...]]扩展测试命令,因为这种表现形式可能对某些语言的程序员来说更熟悉。注意[[是一个关键字,并不是一个命令。
Bash把[[ $a -lt $b ]]看作是一个单独的元素,并且返回一个退出状态码。
if命令能够测试任何命令,并不仅仅是中括号中的条件。
一个if/then结构可以包含嵌套的比较操作和条件判断操作
if [ condition-true ]
then
command 1
command 2
...
else
command 3
command 4
...
fi
Else if 和 elif
elif是else if的缩写形式。作用是在外部的判断结构中再嵌入一个内部的if/then结构。
if [ condition1 ]
then
command1
command2
elif [ condition2 ]
then
command3
command4
else
default-command
fi
if test condition-true结构与if [ condition-true ] 完全相同。左中括号,是调用test命令的标识。而关闭条件判断用的是右中括号。右中括号在if/test结构中并不是严格必须的,但在Bash的新版本中必须要求使用。
test命令在Bash中是内建命令,用来测试文件类型,或者用来比较字符串。因此,在Bash脚本中,test命令不会调用外部的/usr/bin/test中的test命令,这是sh-utils工具包中的一部分。同样的,[ 也不会调用/usr/bin/[,这是/usr/bin/test的符号链接。
test, /usr/bin/test, [ ] 和/usr/bin/[都是等价命令。
[[ ]]结构比[ ] 结构更加通用。这是一个扩展的test命令。
使用[[...]]而不是[...],能够防止脚本中的许多逻辑错误。比如,&& || < >操作符能够正常存在于[[]]条件判断结构中,但是如果出现在[ ]结构中则会报错。
在if后面不一定非得是test命令或用于条件判断的中括号结构。也可以是"if COMMAND"结构,它将会返回COMMAND的退出状态码。
算术测试使用的是(( ))结构。如果表达式的结果为0,那么返回的退出状态码为1,或者是假。而一个非零值的表达式所返回的退出状态码将为0,或者是真。这和之前的test命令和[ ]结构的行为正好相反。
文件测试操作符
如果下面的条件成立将会返回真。
-e 文件存在
-f 这是一个一般文件(并不是目录或者设备文件)
-s 文件大小不为零
-d 这是一个目录
-b 这是一个块设备(软盘,光驱等等)
-c 这是一个字符设备(键盘,modem,声卡等等)
-p 这个文件是一个管道
-h 这是一个符号链接
-L 这是一个socket
-t 文件(描述符)被关联到一个终端设备上
-r 文件是否具有可读权限。
-w 文件是否具有可写权限
-x 文件是否具有可执行权限
-g set-group-id(sgid)标记被设置到文件或目录上
-u set-user-id(suid)标记被设置到文件上
-k 设置粘贴位
-O 判断你是否是文件的拥有者
-G 文件的group-id是否与你的相同
-N 从文件上一次被读取到现在为止,文件是否被修改过
f1 -nt f2 文件f1比文件f2新
f1 -ot f2 文件f1比文件f2旧
f1 -ef f2 文件f1和文件f2是相同文件的硬链接
! “非”,翻转上边所有测试的结果(如果没给出条件,那么返回真)
比较操作符
整数比较
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
< 小于(以下与<和>相关的符号都是在双括号中使用用于算术测试)
<= 小于等于
> 大于
>= 大于等于
字符串比较
=和== 等于,这两个符号等价
==比较操作在双中括号和单中括号中的行为是不同的。
[[ $a == z* ]] 如果$a以"z"开头(模式匹配),那么结果将为真
[[ $a == "z*" ]] 如果$a与z*相等(字面意思完全一样),那么结果将为真
[ $a == z* ] 文件扩展匹配和单词分割有效
[ "$a" == "z*" ] 同双括号
!= 不等号。
< 小于,按照ASCII字符进行排序
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ] 在单括号结构中使用需要进行转义
> 大于
-z 字符串为"null",意思就是字符串长度为零
-n 字符串不为"null"
-a 逻辑与
-o 逻辑或
这两个与比较操作符&&和||非常相像,但是这两个操作符是用在双中括号结构中的
[[ condition1 && condition2 ]]
if[ “$exp1” -a "$exp2" ] -o和-a操作符一般都是和test命令或者是单中括号结构一起使用的