0. 序言
test([]) 和 [[]] 在 Shell 中都是用来检测某个条件是否成立。通过附带选项,可以进行数值、字符串和文件三个方面的检测。
0.1. 与数值比较相关的选项
num1 -eq num2 判断 num1 是否和 num2 相等 num1 -ne num2 判断 num1 是否和 num2 不相等 num1 -gt num2 判断 num1 是否大于 num2 num1 -lt num2 判断 num1 是否小于 num2 num1 -ge num2 判断 num1 是否大于等于 num2 num1 -le num2 判断 num1 是否小于等于 num2
注意:只能用来比较整数。
0.2. 与字符串判断相关的选项
-z str 判断字符串 str 是否为空 -n str 判断宇符串 str 是否为非空 str1 = str2 str1 == str2 =和==是等价的,都用来判断 str1 是否和 str2 相等 str1 != str2 判断 str1 是否和 str2 不相等 str1 > str2 判断 str1 是否大于 str2 str1 < str2 判断 str1 是否小于 str2
注意:>(<) 在 test 中使用时需要加上转义,即:\>(\<)。这样写是为了防止被误认为重定向运算符。而在 [[]] 中则不需要转义。
0.3. 与文件检测相关的选项
文件类型判断 -b filename 判断文件是否存在,并且是否为块设备文件 -c filename 判断文件是否存在,并且是否为字符设备文件 -d filename 判断文件是否存在,并且是否为目录文件 -e filename 判断文件是否存在 -f filename 判断文件是否存在,井且是否为普通文件 -s filename 判断文件是否存在,并且是否为非空 -L filename 判断文件是否存在,并且是否为符号链接文件 -p filename 判断文件是否存在,并且是否为管道文件 -S filename 判断该文件是否存在,并且是否为套接字文件 文件权限判断 -r filename 判断文件是否存在,并且是否拥有读权限 -w filename 判断文件是否存在,并且是否拥有写权限 -x filename 判断文件是否存在,并且是否拥有执行权限 文件比较 filename1 -nt filename2 判断 filename1 的修改时间是否比 filename2 的新 filename -ot filename2 判断 filename1 的修改时间是否比 filename2 的旧
0.4. 与逻辑运算相关的选项
expression1 -a expression 逻辑与,表达式 expression1 和 expression2 都成立,最终的结果才成立 expression1 -o expression2 逻辑或,表达式 expression1 和 expression2 有一个成立,最终的结果就成立 !expression 逻辑非,对 expression 进行取反。
注意:[[ ]] 不能使用 -o 和 -a 选项,只能只用 || 和 &&。
1. test/[]
test 是 Shell 内置命令,其用法为:
test expression
test 命令也可以简写为 [],它的用法为:
[ expression ]
当 expression 成立时,退出状态为 0,否则为非 0 值。
注意 [] 和 expression 之间的空格,这两个空格是必须的,否则会导致语法错误。
使用一个命令其实就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数。
假设 test 命令对应的函数是 func(), 使用如下:
test -z $str 会被替换成 func("-z $str")
如果 str 为空字符串时,那么会被替换成:
func("-z ")
会认为 -z 参数没有选项,分析出错。如果给 $str 加上双引号,则会被替换成:
func("-z \"\"")
很显然, -z 选项后面跟的是一个空字符串(\"表示转义字符),就不会出错。因此,在 test 中使用变量建议用双引号包围起来。
2. [[]]
[[]] 是 Shell 内置关键字,其用法为:
[[ expression ]]
当 expression 成立时,退出状态为 0,否则为非 0 值。
注意 [[ ]] 判断 expression 之间的空格,这两个空格是必须的,否则会导致语法错误。
2.1. 特殊点
[[ ]] 在使用时没有给函数传递参数的过程,所以 test 命令的某些注意事项在 [[ ]] 中就不存在了,具体包括:
- 不需要把变量名用双引号包围起来,即使变量是空值,也不会出错。
- 不需要对 >、< 进行转义,转义后会出错。
[[ ]] 支持 &&、|| 和 ! 三种逻辑运算符
对多个表达式进行逻辑运算时,可以使用逻辑运算符将多个 test 命令连接起来,例如:
[ -z "$str1" ] || [ -z "$str2" ]
也可以借助选项把多个表达式写在一个 test 命令中,例如:
[ -z "$str1" -o -z "$str2" ]
使用 [[ ]] 对上面的语句进行改进:
[[ -z $str1 || -z $str2 ]]
2.2. 支持正则表达式
可以使用 =~ 来检测字符串是否符合某个正则表达式,它的用法为:
[[ str =~ regex ]]
标签:Shell,num1,num2,--,是否,filename,判断,test From: https://www.cnblogs.com/chien/p/17329748.html