shell中的条件判断

if/then结构用来判断命令列表的退出状态码是否为0(因为在UNIX惯例, 0表示"成功"), 如果成功的话, 那么就执行接下来的一个或多个命令。
test命令常用在条件判断语句中,但是常常是以[...]形式出现的。在bash v2.02中引入了[[...]],他是扩展的test命令,支持通配符,比[...]更加通用。

1、[][[]]的区别

  1. 当使用"-n"或者"-z"这种方式判断变量是否为空时,"[ ]"与"[[ ]]"是有区别的。
    使用"[ ]"时需要在变量的外侧加上双引号,与test命令的用法完全相同,使用"[[ ]]"时则不用。
  2. 在使用"[[ ]]"时,不能使用"-a"或者"-o"对多个条件进行连接。
    在使用"[ ]"时,如果使用"-a"或者"-o"对多个条件进行连接,"-a"或者"-o"必须被包含在"[ ]"之内。
    在使用"[ ]"时,如果使用"&&"或者"||"对多个条件进行连接,"&&"或者"||"必须在"[ ]"之外。
  3. 在使用符号"=~"去匹配正则表达式时,只能使用"[[ ]]",当使用">"或者"<"判断字符串的ASCII值大小时,如果结合"[ ]"使用,则必须对">"或者"<"进行转义。

因此在进行条件判断时更推荐使用[[]],可以避免很多不必要的错误。

2、测试的标志及代表意义

1. 关于某个文件名的“文件类型”判断,如 test -e filename 表示存在否,也即 [[ -e filename ]]
-e  该“文件名”是否存在?(常用)
-f  该“文件名”是否存在且为文件(file)?(常用)
-d  该“文件名”是否存在且为目录(directory)?(常用)
-b  该“文件名”是否存在且为一个 block device 设备?
-c  该“文件名”是否存在且为一个 character device 设备?
-S  该“文件名”是否存在且为一个 Socket 文件?
-p  该“文件名”是否存在且为一个 FIFO (pipe) 文件?
-L  该“文件名”是否存在且为一个链接文件?

2. 关于文件的权限侦测,如 test -r filename 表示可读否 (但 root 权限常有例外)
-r  侦测该文件名是否存在且具有“可读”的权限?
-w  侦测该文件名是否存在且具有“可写”的权限?
-x  侦测该文件名是否存在且具有“可执行”的权限?
-u  侦测该文件名是否存在且具有“SUID”的属性?
-g  侦测该文件名是否存在且具有“SGID”的属性?
-k  侦测该文件名是否存在且具有“Sticky bit”的属性?
-s  侦测该文件名是否存在且为“非空白文件”?

3. 两个文件之间的比较,如: test file1 -nt file2
-nt (newer than)判断 file1 是否比 file2 新
-ot (older than)判断 file1 是否比 file2 旧
-ef 判断 file1 与 file2 是否为同一文件,可用在判断 hard link 的判定上。 主要意义在判定,两个文件是否均指向同一个 inode 哩!

4. 关于两个整数之间的判定,例如 test n1 -eq n2
-eq 两数值相等 (equal)
-ne 两数值不等 (not equal)
-gt n1 大于 n2 (greater than)
-lt n1 小于 n2 (less than)
-ge n1 大于等于 n2 (greater than or equal)
-le n1 小于等于 n2 (less than or equal)

5. 判定字串的数据
test -z string  判定字串是否为 0 ?若 string 为空字串,则为 true
test -n string  判定字串是否非为 0 ?若 string 为空字串,则为 false。 -n 亦可省略
test str1 == str2   判定 str1 是否等于 str2 ,若相等,则回传 true
test str1 != str2   判定 str1 是否不等于 str2 ,若相等,则回传 false

6. 多重条件判定,例如: test -r filename -a -x filename
-a  (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。
-o  (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。
!   反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true

参考:
高级Bash脚本编程指南
bash中 [ ] 与 [[ ]] 的区别
鸟哥的linux私房菜

你可能感兴趣的:(shell中的条件判断)