Shell test 命令
test 命令用来检查条件是否成立,如比较两个数、判断文件是否存在。它通常与 if、while 配合,是 Shell 脚本中做判断的核心工具。
数值比较
test 比较数字时用的是英文选项而非符号,常见如下: -eq 等于、-ne 不等于、-gt 大于、-ge 大于等于、-lt 小于、-le 小于等于。
a=10
b=20
test $a -eq $b; echo $?
# 输出:1 # 10 不等于 20,条件不成立返回 1
test $a -lt $b; echo $?
# 输出:0 # 10 小于 20 成立返回 0
test $a -ge 10 && echo "a 大于等于 10"
# 输出:a 大于等于 10
字符串比较
字符串用 = 判断相等、!= 判断不等;-z 为空、-n 非空:
s1="hello"
s2="world"
test "$s1" = "$s2"; echo $?
# 输出:1 # 不相等
test "$s1" != "$s2"; echo $?
# 输出:0 # 确实不相等
test -z ""; echo $?
# 输出:0 # 空字符串成立
test -n "$s1"; echo $?
# 输出:0 # 非空成立
注意:字符串变量建议加上双引号,防止变量为空时语法错误。
文件测试
判断文件类型与权限是运维脚本最常用的一类: -e 存在、-f 普通文件、-d 目录、-r 可读、-w 可写、-x 可执行、-s 文件非空。
test -e /etc/hosts; echo $?
# 输出:0 # 文件存在
test -d /etc/hosts; echo $?
# 输出:1 # 不是目录
test -x /usr/bin/ls; echo $?
# 输出:0 # ls 可执行
test -w /etc/hosts && echo "可写" || echo "不可写"
# 输出:不可写(普通用户下)
逻辑组合
多个条件可以用 -a(与)、-o(或)、!(非)组合:
a=5
test $a -gt 3 -a $a -lt 10 && echo "3<a<10"
# 输出:3<a<10
test $a -eq 3 -o $a -eq 5 && echo "a 是 3 或 5"
# 输出:a 是 3 或 5
test ! -d /tmp/notexist && echo "目录不存在"
# 输出:目录不存在
[ ] 与 if 结合写法
[ 条件 ] 是 test 的简写形式,注意方括号两侧必须有空格:
file=/etc/passwd
if [ -f "$file" ]; then
echo "$file 是普通文件"
else
echo "$file 不存在"
fi
# 输出:/etc/passwd 是普通文件
小结
test 命令用 -eq/-lt 等选项比较数字、= 与 -z 判断字符串、-f/-d/-x 检测文件。掌握它再配 if 语句和 [ ] 简写,Shell 脚本就能「有脑子」地做各种判断。