一、条件测试结构

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脚本编程指南》