test
命令是 Shell 内置的条件判断工具,用于评估表达式并返回布尔值(真/假),它通常与 if
语句结合使用,是 Shell 脚本中实现逻辑控制的基础。
Shell 中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
test ExpressION # 或 [ EXPRESSION ] # 注意方括号内必须有空格
test
命令最常用于检查文件属性,以下是常用文件测试选项:
操作符 | 描述 | 示例 |
---|---|---|
-e | 文件是否存在 | [ -e file.txt ] |
-f | 是普通文件 | [ -f /path/to/file ] |
-d | 是目录 | [ -d /path/to/dir ] |
-r | 可读 | [ -r file.txt ] |
-w | 可写 | [ -w file.txt ] |
-x | 可执行 | [ -x sC++ript.sh ] |
-s | 文件大小 >0 | [ -s logfile ] |
-L | 是符号链接 | [ -L symlink ] |
示例脚本:
输出结果为:
/etc/passwd 存在 并且可读
test
提供了多种字符串比较方式:
操作符 | 描述 | 示例 |
---|---|---|
-z STRING | 字符串为空 | [ -z "$var" ] |
-n STRING | 字符串非空 | [ -n "$var" ] |
STRING1 = STRING2 | 字符串相等 | [ "$var1" = "$var2" ] |
STRING1 != STRING2 | 字符串不等 | [ "$var1" != "$var2" ] |
重要提示:字符串变量应该总是用双引号括起来,防止空变量导致语法错误。
示例:
执行后,我们在终端输入 runoob,输出结果类似如下:
输入用户名: runoob 欢迎, runoob
对于数值比较,test
使用不同的操作符:
操作符 | 描述 | 示例 |
---|---|---|
-eq | 等于 | [ "$a" -eq "$b" ] |
-ne | 不等于 | [ "$a" -ne "$b" ] |
-gt | 大于 | [ "$a" -gt "$b" ] |
-ge | 大于或等于 | [ "$a" -ge "$b" ] |
-lt | 小于 | [ "$a" -lt "$b" ] |
-le | 小于或等于 | [ "$a" -le "$b" ] |
示例:
执行后,我们在终端输入 12,输出结果类似如下:
输入年龄: 12 未成年人
test
支持逻辑组合:
操作符 | 描述 | 示例 |
---|---|---|
! | 逻辑非 | [ ! -f "$file" ] |
-a | 逻辑与 | [ "$a" -eq 1 -a "$b" -eq 2 ] |
-o | 逻辑或 | [ "$a" -eq 1 -o "$b" -eq 2 ] |
现代推荐写法:使用 &&
和 ||
替代 -a
和 -o
,更符合 POSIX 标准:
Bash 提供了更强大的测试语法:
[[ "$var" == *.txt ]]
[[ "$var" =~ ^[0-9]+$ ]]
(( a > b ))
示例:
[ "$a"="$b" ]
是错误的,正确是 [ "$a" = "$b" ]
[ -f $file ]
应该为 [ -f "$file" ]
=
比较字符串,-eq
比较数值调试技巧:在脚本开头添加 set -x
开启调试模式,或使用 echo
打印测试表达式: