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 脚本就能「有脑子」地做各种判断。

笔记加载中…