在编写Shell脚本时候,经常需要判断两个字符串是否相等,检查文件状态或者是数字的测试等。Shell提供了对字符串、文件、数值等内容的条件测试以及逻辑流程控制。
常用测试操作
test命令,测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值。
格式1
test 条件表达式
格式2
[ 条件表达式 ] //常用格式,使用方括号时,要注意在条件两边加上空格。
常见测试类型:
- 测试文件状态
- 字符串的比较
- 整数值的比较
- 逻辑测试
测试文件
[ 操作符 文件或目录 ]
操作符:
-d:测试是否为目录,是则为真(Directory)
-e:测试目录或文件是否存在,存在则为真(Exist)
-f:测试是否为文件,是则为真(file)
-r:测试当前用户是否有权限读取,是则为真(read)
-w:测试当前用户是否有权限写入,是这为真(write)
-x:测试当前用户是否可执行该文件,可执行则为真(Excute)
-L:测试是否为符号链接文件,是则为真(Link)
-nt:file1 -nt file2 如果 file1 比 file2 新(修改时间),则为真
-ot:file1 -ot file2 如果 file1 比 file2 旧(修改时间),则为真
字符串比较
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
操作符:
=:字符串内容相同则为真,就是说包含的文本一摸一样。
!=:字符串内容不同,则为真(!号表示相反的意思)
-z:字符串内容为空(长度为零)则为真
-n:字符串内容非空(长度非零)则为真
<:string1 < string2 如果string1在本地的字典序列中排在string2之前,则为真
>:string2 如果string1在本地的字典序列中排在string2之后,则为真
注意点:
- 字符串的 “等于” 比较,为了与POSIX一致,在[]中使用=,(尽管==也可以可以用的)
- 注意在=前后各有一个空格,如果没有空格就是赋值的关系,不是比较的关系。
- 字符串的> <比较运算符,一般放在[[ ]]之中,而不是test ("[]")
- 字符串的> <比较的结果,与本地的locale有关,是按照其字典序列进行比较的
整数值比较
[ 整数1 操作符 整数2 ]
操作符:
-eq:等于(equal)
-ne:不等于(not equal)
-gt:大于(Greater than)
-lt:小于(lesser than)
-le:小于等于(lesser or equal)
-ge:大于等于(Greater or equal)
逻辑测试
[ 表达式1 ] 操作符 [ 表达式2 ] ...
操作符:
-a 或 && :逻辑与,“而且”的意思,前后两个表达式都成立时整个测试结果才为真,否则为假
-o 或 || : 逻辑或,“或者”的意思,操作符两边至少一个为真时,结果为真,否为为假
! :逻辑否,当制定条件不成立时,返回结果为真