test - Shell 条件判断

test 检查条件并通过退出状态表示结果:条件为真时返回 0,为假时返回非零值。[ expression ] 是常见的等价写法,方括号两侧必须保留空格。

数值比较

  • INTEGER1 -eq INTEGER2:相等。
  • INTEGER1 -ne INTEGER2:不相等。
  • INTEGER1 -gt INTEGER2:大于。
  • INTEGER1 -ge INTEGER2:大于等于。
  • INTEGER1 -lt INTEGER2:小于。
  • INTEGER1 -le INTEGER2:小于等于。
num1=100
num2=200
 
if test "$num1" -eq "$num2"; then
  printf '%s\n' '两个数相等'
else
  printf '%s\n' '两个数不相等'
fi

字符串判断

  • -z STRING:字符串长度为零。
  • -n STRING:字符串长度非零。
  • STRING1 = STRING2:字符串相等。
  • STRING1 != STRING2:字符串不相等。
value=''
 
if [ -z "$value" ]; then
  printf '%s\n' '字符串为空'
fi

变量应放在双引号中,避免空值或空格改变参数数量。

文件判断

  • -e FILE:路径存在。
  • -f FILE:存在且为普通文件。
  • -d FILE:存在且为目录。
  • -r FILE:当前进程可读。
  • -w FILE:当前进程可写。
  • -x FILE:当前进程可执行或可访问。
  • -s FILE:存在且大小大于零。
  • -L FILE:存在且为符号链接。
file='example.txt'
 
if [ -f "$file" ] && [ -r "$file" ]; then
  printf '%s\n' '文件存在且可读'
fi

判断命令是否成功

可以直接把命令放在 if 后面,不必单独读取 $?

if command_to_run; then
  printf '%s\n' '执行成功'
else
  printf '%s\n' '执行失败'
fi

[ ][[ ]]

  • [ ] 对应 test,适合需要兼容 POSIX Shell 的脚本。
  • [[ ]] 是 Bash、ksh、zsh 等 Shell 支持的复合命令,可使用模式匹配以及 &&||
name='report.txt'
 
if [[ $name == *.txt && -n $name ]]; then
  printf '%s\n' '匹配文本文件'
fi

参考资料