Shell test命令详解:用法、选项及参数说明
时间:2026-08-14 | 作者:318050 | 阅读:0test 是 Shell 的内置命令,作用很直接:判断某个条件是否满足。
实际使用时,它通常会和 if 语句配合出现。很多条件判断的写法,本质上都离不开 test。
这个命令支持的检测范围也比较全面,主要集中在三类:数值判断、字符串判断,以及文件相关判断。
Shell test 命令的基本写法
Shell test 命令的基本写法如下:
test expression
当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值。
test 命令也可以简写为 [],它的用法为:
[ expression ]
注意:[] 和 expression 之间的空格必须保留,否则会导致语法错误。
[] 的写法更简洁,所以比 test 使用频率更高。
test 和 [] 是等价的,后续我们会交替使用 test 和 [],以让读者尽快熟悉。
在《Shell if else》中,我们使用 (()) 进行数值比较。
这节我们就来看一下,如何使用 test 命令进行数值比较。
#!/bin/bash
read age
if test $age -le 2; then
echo "婴儿"
elif test $age -ge 3 && test $age -le 8; then
echo "幼儿"
elif [ $age -ge 9 ] && [ $age -le 17 ]; then
echo "少年"
elif [ $age -ge 18 ] && [ $age -le 25 ]; then
echo "成年"
elif test $age -ge 26 && test $age -le 40; then
echo "青年"
elif test $age -ge 41 && [ $age -le 60 ]; then
echo "中年"
else
echo "老年"
fi
其中,-le 选项表示小于等于,-ge 选项表示大于等于,&& 是逻辑与运算符。
学习 test 命令,重点是学习它的各种选项。下面我们逐一讲解。
1) 与文件检测相关的 test 选项
| 文件类型判断 | |
|---|---|
| 选 项 | 作 用 |
| -b filename | 判断文件是否存在,并且是否为块设备文件。 |
| -c filename | 判断文件是否存在,并且是否为字符设备文件。 |
| -d filename | 判断文件是否存在,并且是否为目录文件。 |
| -e filename | 判断文件是否存在。 |
| -f filename | 判断文件是否存在,井且是否为普通文件。 |
| -L filename | 判断文件是否存在,并且是否为符号链接文件。 |
| -p filename | 判断文件是否存在,并且是否为管道文件。 |
| -s filename | 判断文件是否存在,并且是否为非空。 |
| -S filename | 判断该文件是否存在,并且是否为套接字文件。 |
| 文件权限判断 | |
| 选 项 | 作 用 |
| -r filename | 判断文件是否存在,并且是否拥有读权限。 |
| -w filename | 判断文件是否存在,并且是否拥有写权限。 |
| -x filename | 判断文件是否存在,并且是否拥有执行权限。 |
| -u filename | 判断文件是否存在,并且是否拥有 SUID 权限。 |
| -g filename | 判断文件是否存在,并且是否拥有 SGID 权限。 |
| -k filename | 判断该文件是否存在,并且是否拥有 SBIT 权限。 |
| 文件比较 | |
| 选 项 | 作 用 |
| filename1 -nt filename2 | 判断 filename1 的修改时间是否比 filename2 的新。 |
| filename -ot filename2 | 判断 filename1 的修改时间是否比 filename2 的旧。 |
| filename1 -ef filename2 | 判断 filename1 是否和 filename2 的 inode 号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 |
Shell test 文件检测举例:
#!/bin/bash
read filename
read url
if test -w $filename && test -n $url
then
echo $url > $filename
echo "写入成功"
else
echo "写入失败"
fi
在 Shell 脚本文件所在的目录新建一个文本文件并命名为 urls.txt,然后运行 Shell 脚本,运行结果为:
urls.txt↙
http://c.biancheng.net/shell/↙
写入成功
2) 与数值比较相关的 test 选项
| 选 项 | 作 用 |
|---|---|
| num1 -eq num2 | 判断 num1 是否和 num2 相等。 |
| num1 -ne num2 | 判断 num1 是否和 num2 不相等。 |
| num1 -gt num2 | 判断 num1 是否大于 num2 。 |
| num1 -lt num2 | 判断 num1 是否小于 num2。 |
| num1 -ge num2 | 判断 num1 是否大于等于 num2。 |
| num1 -le num2 | 判断 num1 是否小于等于 num2。 |
注意:test 只能用来比较整数,小数相关的比较还得依赖 bc 命令。
Shell test 数值比较举例:
#!/bin/bash
read a b
if test $a -eq $b
then
echo "两个数相等"
else
echo "两个数不相等"
fi
运行结果1:
10 10
两个数相等
运行结果2:
10 20
两个数不相等
3) 与字符串判断相关的 test 选项
| 选 项 | 作 用 |
|---|---|
| -z str | 判断字符串 str 是否为空。 |
| -n str | 判断宇符串 str 是否为非空。 |
|
str1 = str2 str1 == str2 |
=和==是等价的,都用来判断 str1 是否和 str2 相等。 |
| str1 != str2 | 判断 str1 是否和 str2 不相等。 |
| str1 > str2 |
判断 str1 是否大于 str2。>是>的转义字符,这样写是为了防止>被误认为成重定向运算符。 |
| str1 < str2 |
判断 str1 是否小于 str2。同样,<也是转义字符。 |
有C语言、C++、Python、Ja va 等编程经验的读者请注意,==、>、< 在大部分编程语言中都用来比较数字,而在 Shell 中,它们只能用来比较字符串,不能比较数字,这是非常奇葩的,大家要习惯。
其次,不管是比较数字还是字符串,Shell 都不支持 >= 和 <= 运算符,切记。
Shell test 字符串比较举例:
#!/bin/bash
read str1
read str2
#检测字符串是否为空
if [ -z "$str1" ] || [ -z "$str2" ]
then
echo "字符串不能为空"
exit 0
fi
#比较字符串
if [ $str1 = $str2 ]
then
echo "两个字符串相等"
else
echo "两个字符串不相等"
fi
运行结果:
http://c.biancheng.net/
http://c.biancheng.net/shell/
两个字符串不相等
细心的读者可能已经注意到,变量 $str1 和 $str2 都被双引号包围起来。
这样做是为了防止 $str1 或者 $str2 是空字符串时出现错误。本文后续部分将分析具体原因。
4) 与逻辑运算相关的 test 选项
| 选 项 | 作 用 |
|---|---|
| expression1 -a expression | 逻辑与,表达式 expression1 和 expression2 都成立,最终的结果才是成立的。 |
| expression1 -o expression2 | 逻辑或,表达式 expression1 和 expression2 有一个成立,最终的结果就成立。 |
| !expression | 逻辑非,对 expression 进行取反。 |
改写上面的代码,使用逻辑运算选项:
#!/bin/bash
read str1
read str2
#检测字符串是否为空
if [ -z "$str1" -o -z "$str2" ] #使用 -o 选项取代之前的 ||
then
echo "字符串不能为空"
exit 0
fi
#比较字符串
if [ $str1 = $str2 ]
then
echo "两个字符串相等"
else
echo "两个字符串不相等"
fi
前面的代码使用了两个 [] 命令,并使用 || 运算符将它们连接起来。
这里改成 -o 选项后,只使用一个 [] 命令就可以了。
在 test 中使用变量建议用双引号包围起来
test 和 [] 都是命令,一个命令本质上对应一个程序或者一个函数。
即使是一个程序,它也有入口函数。例如 C语言程序的入口函数是 main()。运行 C语言程序就从 main() 函数开始,所以也可以将一个程序等效为一个函数。
这样我们就不用再区分函数和程序了,直接将一个命令和一个函数对应起来即可。
有了以上认知,就很容易看透命令的本质了:使用一个命令其实就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数。
假设 test 命令对应的函数是 func(),使用 test -z $str1 命令时,会先将变量 $str1 替换成字符串:
- 如果 $str1 是一个正常的字符串,比如 abc123,那么替换后的效果就是
test -z abc123,调用 func() 函数的形式就是func("-z abc123")。test 命令后面附带的所有选项和参数会被看成一个整体,并作为实参传递进函数。 - 如果 $str1 是一个空字符串,那么替换后的效果就是
test -z,调用 func() 函数的形式就是func("-z ")。这就比较奇怪了,因为-z选项没有和参数成对出现,func() 在分析时就会出错。
如果我们给 $str1 变量加上双引号,当 $str1 是空字符串时,test -z "$str1" 就会被替换为 test -z ""。
调用 func() 函数的形式就是 func("-z """)。很显然,-z 选项后面跟的是一个空字符串("表示转义字符),这样 func() 在分析时就不会出错了。
所以,当你在 test 命令中使用变量时,我强烈建议将变量用双引号""包围起来,这样能避免变量为空值时导致的很多奇葩问题。
总结
test 命令比较奇葩,>、<、== 只能用来比较字符串,不能用来比较数字。
比较数字需要使用 -eq、-gt 等选项;不管是比较字符串还是数字,test 都不支持 >= 和 <=。
有经验的程序员需要慢慢习惯 test 命令的这些奇葩用法。
对于整型数字的比较,我建议大家使用 (()),这在《Shell if else》中已经进行了演示。
(()) 支持各种运算符,写法也符合数学规则,用起来更加方便,何乐而不为呢?
几乎完全兼容 test,并且比 test 更加强大、更加灵活的是 [[ ]];[[ ]] 不是命令,而是 Shell 关键字,下节《Shell [[]]》我们将会讲解。
来源:整理自互联网
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- C# BitArray位数组用法详解与应用场景
- 时间:2026-08-14
-
- Boolean变量命名规范:布尔值到底该怎么取名更清晰
- 时间:2026-08-14
-
- C#中指针变量与unsafe用法详解
- 时间:2026-08-14
-
- GCC中-D参数定义宏的方法与使用示例
- 时间:2026-08-14
-
- 优慕课App安卓版下载与安装教程
- 时间:2026-08-14
-
- Shell脚本中使用循环创建文件与批量处理方法
- 时间:2026-08-14
-
- Lua协程从create到yield入门与实战指南
- 时间:2026-08-14
-
- 应用汇网页版官网入口下载安装指南
- 时间:2026-08-14
精选合集
更多大家都在玩
热门话题
大家都在看
更多-
- Jupyter Notebook浏览器打不开怎么解决与排查方法
- 时间:2026-08-14
-
- Jupyter Notebook彻底卸载教程:如何干净删除残留文件
- 时间:2026-08-14
-
- 联想平板退出学生模式后原设置会恢复吗
- 时间:2026-08-14
-
- SwarmUI下载后怎么用?本地安装教程与中文界面参数设置
- 时间:2026-08-14
-
- 最新Jan AI安装部署教程:Windows配置、API调用与运行指南
- 时间:2026-08-14
-
- Laravel8老项目平滑改造Vite引入CSS实战指南
- 时间:2026-08-14
-
- PHP框架审计教程:枚举类型安全审计方法与要点
- 时间:2026-08-14
-
- vivo Y35a最新系统功能一览
- 时间:2026-08-14
![Shell test命令详解:用法、选项及参数说明_wishdown.com Shell test命令(Shell [])详解,附带所有选项及说明](https://img.wishdown.com/upload/news/20260814e1036355c52c6bcd5e8bb31d56d1adb2.webp)