Shell test命令#
test是shell内置命令,用来检测某个条件是否成立。通常和if一起使用。
当你在 test 命令中使用变量时,我强烈建议将变量用双引号""
包围起来,这样能避免变量为空值时导致的很多奇葩问题
test expression
:当expression成立时,返回0(true)。
[ expression ]
:简写,需要注意,expression两边都有一个空格。
与文件检测相关选项#
1,文件类型判断#
-b filename |
判断文件是否存在,并且是否为块设备文件。 |
-c filename |
判断文件是否存在,并且是否为字符设备文件。 |
-d filename |
判断文件是否存在,并且是否为目录文件。 |
-e filename |
判断文件是否存在。 |
-f filename |
判断文件是否存在,井且是否为普通文件。 |
-L filename |
判断文件是否存在,并且是否为符号链接文件。 |
-p filename |
判断文件是否存在,并且是否为管道文件。 |
-s filename |
判断文件是否存在,并且是否为非空。 |
-S filename |
判断该文件是否存在,并且是否为套接字文件。 |
2,文件权限判断#
-r filename |
判断文件是否存在,并且是否拥有读权限。 |
-w filename |
判断文件是否存在,并且是否拥有写权限。 |
-x filename |
判断文件是否存在,并且是否拥有执行权限。 |
-u filename |
判断文件是否存在,并且是否拥有 SUID 权限。 |
-g filename |
判断文件是否存在,并且是否拥有 SGID 权限。 |
-k filename |
判断该文件是否存在,并且是否拥有 SBIT 权限。 |
3,文件比较#
filename1 -nt filename2 |
判断 filename1 的修改时间是否比 filename2 的新。 |
filename -ot filename2 |
判断 filename1 的修改时间是否比 filename2 的旧。 |
filename1 -ef filename2 |
判断 filename1 是否和 filename2 的 inode 号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 |
与数值比较相关#
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。<= |
与字符串比较#
-z str |
判断字符串 str 是否为空。 |
-n str |
判断宇符串 str 是否为非空。 |
str1 = str2 str1 == str2 |
= 和== 是等价的,都用来判断 str1 是否和 str2 相等。 |
str1 != str2 |
判断 str1 是否和 str2 不相等。 |
str1 > str2 |
判断 str1 是否大于 str2。\> 是> 的转义字符,这样写是为了防止> 被误认为成重定向运算符。 |
str1 < str2 |
判断 str1 是否小于 str2。同样,\< 也是转义字符。 |
与逻辑运算比较#
expression1 -a expression |
逻辑与,表达式 expression1 和 expression2 都成立,最终的结果才是成立的。 |
expression1 -o expression2 |
逻辑或,表达式 expression1 和 expression2 有一个成立,最终的结果就成立。 |
!expression |
逻辑非,对 expression 进行取反。 |
if [ -z "$str1" -o -z "$str2" ]
shell [[]]#
[[]],是shell内置关键字,可以说是[]的升级版本!
[[ ]] 是 Shell 内置关键字,不是命令,在使用时没有给函数传递参数的过程,所以 test 命令的某些注意事项在 [[ ]] 中就不存在了,具体包括:
- 不需要把变量名用双引号
""
包围起来,即使变量是空值,也不会出错。
- 不需要、也不能对 >、< 进行转义,转义后会出错。
[[ ]]支持逻辑运算符
test 或 [] |
|
[[]] |
|
[ -z “$str1” ] || [ -z “$str2” ] |
√ |
[[ -z $str1 ]] || [[ -z $str2 ]] |
√ |
[ -z “$str1” -o -z “$str2” ] |
√ |
[[ -z $str1 -o -z $str2 ]] |
× |
[ -z $str1 || -z $str2 ] |
× |
[[ -z $str1 || -z $str2 ]] |
√ |
...