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