Shell test 命令
1. Shell test 命令概述
1.1 Shell test 命令简介
在我们之前章节学习了 Shell 的运算符,其中大多数运算都可以结合 test 命令来完成测试与比较操作,test 命令配合各种操作符号,不仅可以完成测试逻辑表达式,还可以进行文件,数字,字符串的比较。本文是一些常见用法的归纳总结。
1.2 为什么要用 test 命令
在 Shell 中每个命令都有其应用场景,test 命令也不例外,其应用场景几乎遍布我们整个 Shell 脚本的生命周期,基本上 Shell 脚本里面都会有其身影。
当我们对数值进行算术运算,当我们需要对文件进行判断,当我们需要对逻辑或字符串进行判断的时候,这些情况都需要使用 test 命令来配合运算符进行操作。
2. Shell test 命令简介
2.1 状态返回值
在我们学习 test 命令之前,我们需要知道在 Linux 中执行命令返回 0 为正常,返回非 0 表示异常,可以利用 $? 来获取返回值。在下面的 test 操作中我们就会运用此特性来进行测试比较。
2.2 test 命令简介
- test 命令
test 为 Shell 内置命令,其通常需要与 if 语句一块使用。
- 语法格式
语法格式为 test expression, 当 test 判断 expression 为成立时,返回状态为 0,否则为非 0 值。
test 命令还可以简写为 [ ], 需要在两边中括号与 expression 是有一个空格,这个空格是必须的,否则会导致语法错误。[] 的写法更加简洁,比 test 使用频率更高。
我们可以简单来看示例:
[root@master shell_test]# cat test1.sh #!/bin/bash // 使用中括号 if test 10 -ne 1;then echo "true" else echo "false" fi [root@master shell_test]# bash test1.sh true [root@master shell_test]# cat test2.sh #!/bin/bash // 使用test if [ 10 -eq 1 ];then echo "true" else echo "false" fi [root@master shell_test]# bash test2.sh true 3. test 命令操作
test 命令操作主要配合比较运算符进行,可大体分为文件判断 / 数组比较 / 字符串判断 / 逻辑运算等。
3.1 数值比较
数组比较其实就是 test 命令配合关系运算符进行数字比较。
| 比较符 | 描述 | 示例 |
|---|---|---|
| -eq,equal | 等于 | [1 -eq 1] 为 true |
| -ne,not equal | 不等于 | [ 1 -ne 1] 为 false |
| -gt,greater than | 大于 | [2 -gt 1] 为 true |
| -lt,lesser than | 小于 | [2 -lt 1] 为 false |
| -ge,greater or equal | 大于或等于 | [2 -ge 1] 为 true |
| -le,lesser or equal | 小于或等于 | [2 -le 1] 为 false |
关系运算顾名思义就是比较数字的大小,注意关系运算符作用的对象为数字。
#!/bin/bash num1=1 num2=2 echo "num1 为:${num1}" echo "num2 为:${num2}" if [ $num1 -eq $num2 ] then echo "$num1 -eq $num2 : num1 等于 num2" else echo "$num1 -eq $num2: num1 不等于 num2" fi if [ $num1 -ne $num2 ] then echo "$num1 -ne $num2: num1 不等于 num2" else echo "$num1 -ne $num2 : num1 等于 num2" fi if [ $num1 -gt $num2 ] then echo "$num1 -gt $num2: num1 大于 num2" else echo "$num1 -gt $num2: num1 不大于 num2" fi if [ $num1 -lt $num2 ] then echo "$num1 -lt $num2: num1 小于 num2" else echo "$num1 -lt $num2: num1 不小于 num2" fi if [ $num1 -ge $num2 ] then echo "$num1 -ge $num2: num1 大于或等于 num2" else echo "$num1 -ge $num2: num1 小于 num2" fi if [ $num1 -le $num2 ] then echo "$num1 -le $num2: num1 小于或等于 num2" else echo "$num1 -le $num2: num1 大于 num2" fi 运行结果为:
num1 为:1 num2 为:2 1 -eq 2: num1 不等于 num2 1 -ne 2: num1 不等于 num2 1 -gt 2: num1 不大于 num2 1 -lt 2: num1 小于 num2 1 -ge 2: num1 小于 num2 1 -le 2: num1 小于或等于 num 3.2 文件判断
在本章节由于 test 命令与运算符配合使用,与之前运算符章节有重复,我们在此温故知新,着手 test 命令来学习文件判断。
文件测试在我们编写 Shell 中与文件操作非常常用,熟练掌握文件操作可以在后续的 Shell 编写中得心应手,例如 file 变量为:
| 操作符 | 说明 | 举例 |
|---|---|---|
| -d | file 检测文件是否是目录,如果是,则返回 true。 | [-d $file] 返回 false。 |
| -f | file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [-f $file] 返回 true。 |
| -c | file 检测文件是否是字符设备文件,如果是,则返回 true。 | [-c $file] 返回 false。 |
| -b | file 检测文件是否是块设备文件,如果是,则返回 true。 | [-b $file] 返回 false。 |
| -g | file 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [-g $file] 返回 false。 |
| -u | file 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [-u $file] 返回 false。 |
| -k | file 检测文件是否设置了粘着位 (Sticky Bit),如果是,则返回 true。 | [-k $file] 返回 false。 |
| -p | file 检测文件是否是有名管道,如果是,则返回 true。 | [-p $file] 返回 false。 |
| -r | file 检测文件是否可读,如果是,则返回 true。 | [-r $file] 返回 true。 |
| -w | file 检测文件是否可写,如果是,则返回 true。 | [-w $file] 返回 true。 |
| -x | file 检测文件是否可执行,如果是,则返回 true。 | [-x $file] 返回 true。 |
| -s | file 检测文件是否为空(文件大小是否大于 0),不为空返回 true。 | [-s $file] 返回 true。 |
| -e | file 检测文件(包括目录)是否存在,如果是,则返回 true。 | [-e $file] 返回 true。 |
例如:
#!/bin/bash TEST_FILE="/etc/fstab" echo "检测的文件为:${TEST_FILE}" echo "文件信息为:$(ls -l ${TEST_FILE})" if [ -r $TEST_FILE ] then echo "文件可读" else echo "文件不可读" fi if [ -w $TEST_FILE ] then echo "文件可写" else echo "文件不可写" fi if [ -x $TEST_FILE ] then echo "文件可执行" else echo "文件不可执行" fi if [ -f $TEST_FILE ] then echo "文件为普通文件" else echo "文件为特殊文件" fi if [ -d $TEST_FILE ] then echo "文件是个目录" else echo "文件不是个目录" fi if [ -s $TEST_FILE ] then echo "文件不为空" else echo "文件为空" fi if [ -e $TEST_FILE ] then echo "文件存在" else echo "文件不存在" fi 返回为:
检测的文件为:/etc/fstab 文件信息为:-rw-r--r--. 1 root root 500 Jan 17 14:23 /etc/fstab 文件可读 文件可写 文件不可执行 文件为普通文件 文件不是个目录 文件不为空 文件存在 3.3 字符串判断
对于字符串判断与数字对比,其作用的对象不同需要格外注意,利用 test 命令对于字符串进行一些判断操作,假定变量 a 为 “linux”,变量 b 为 “shell”:
| 运算符 | 说明 | 举例 |
|---|---|---|
| =/== | 检测两个字符串是否相等,其中 = 和 == 是相同的,相等返回 true。 | [$a = $b] 返回 false。 |
| != | 检测两个字符串是否相等,不相等返回 true。 | [$a != $b] 返回 true。 |
| -z | 检测字符串长度是否为 0,为 0 返回 true。 | [-z $a] 返回 false。 |
| -n | 检测字符串长度是否为 0,不为 0 返回 true。 | [-n “$a” ] 返回 true。 |
例如:
#!/bin/bash str1="linux" str2="shell" echo "str1 为:${str1}" echo "str2 为:${str2}" if [ $str1 = $str2 ];then echo "$str1 = $str2 : str1 等于 str2" else echo "$str1 = $str2: str1 不等于 str2" fi if [ $str1 != $str2 ];then echo "$str1 != $str2 : str1 不等于 str2" else echo "$str1 != $str2: str1 等于 str2" fi if [ -z $str1 ];then echo "-z $str1 : 字符串长度为 0" else echo "-z $str1 : 字符串长度不为 0" fi if [ -n "$str1" ];then echo "-n $str1 : 字符串长度不为 0" else echo "-n $str1 : 字符串长度为 0" fi if [ ${str1} ];then echo "str1 : 字符串不为空" else echo "str1 : 字符串为空" fi 返回为:
str1 为:linux str2 为:shell linux = shell: str1 不等于 str2 linux != shell : str1 不等于 str2 -z linux : 字符串长度不为 0 -n linux : 字符串长度不为 0 str1 : 字符串不为空 3.4 逻辑运算
利用 test 命令可以进行逻辑判断,以下介绍 Shell 的逻辑运算符,假定变量 A 为 1,变量 b 为 2:
如果需要在一个 test 中执行多个判断,需要使用 [[]], test 是 Shell 内置关键字,不是命令,免除函数传递过程,因此更加建议使用 [[]]。双中括号有以下注意事项:
- 不需要把变量名用双引号
""包围起来,即使变量是空值,也不会出错; - 不需要、也不能对 >、< 进行转义,转义后会出错;
- 其支持正则表达式,组合逻辑可以不使用 test 的 - a,-o 而使用 && ||。
与逻辑运算符号对应的 && 可以使用 -a,|| 可以使用 -o 来替换。
| 运算符 | 说明 | 举例 |
|---|---|---|
| && | 逻辑的 AND | [[ $A -lt 10 && $B -gt 100 ]] 返回 false |
| || | 逻辑的 OR | [[ $A -lt 10 || $B -gt 100 ]] 返回 true |
例如:
#!/bin/bash num1=1 num2=2 echo "num1 为:${num1}" echo "num2 为:${num2}" if [[ $num1 -lt 5 && $num2 -gt 5 ]];then echo "返回 true" else echo "返回 false" fi if [[ $num1 -lt 5 || $num2 -gt 5 ]];then echo "返回 true" else echo "返回 false" fi if [ $num1 -lt 5 ] && [ $num2 -gt 5 ];then echo "返回 true" else echo "返回 false" fi if [ $num1 -lt 5 ] || [ $num2 -gt 5 ];then echo "返回 true" else echo "返回 false" fi if [ $num1 -lt 5 -a $num2 -gt 5 ];then echo "返回 true" else echo "返回 false" fi if [ $num1 -lt 5 -o $num2 -gt 5 ];then echo "返回 true" else echo "返回 false" fi 返回:
num1 为:1 num2 为:2 返回 false 返回 true 返回 false 返回 true 返回 false 返回 true 4. 实例
4.1 需求
编写一个脚本,可以传入任意多个数值,要求输入的数字大于等于 0,脚本执行输出最小的和最大的数字。
4.2 思路
可以利用文件测试运算符来判断输出的目录是否正确,之后利用算术运算符配合数组对文件或目录进行统计。
4.3 实现
#!/bin/bash # Description: count file scripts # Auth: kaliarch # Email: kaliarch@163.com # function: count file # Date: 2020-03-21 14:00 # Version: 1.0 # 判断输入至少一个参数 [ $# -le 1 ] && echo "输入参数错误,至少输入一个数字" && exit 1 for num in $*; do # 判断输入的都为数字且输入数字大于等于0 [ "${num}" -ge 0 ] 2>/dev/null [ $? -ne 0 ] && echo "输入的${num}不符合参数规范" && exit 1 done # 对目录下的文件进行统计 MIN_NUM=$1 MAX_NUM=$1 for num in $*; do if [ ${num} -gt ${MAX_NUM} ];then MAX_NUM=${num} elif [ ${num} -lt ${MIN_NUM} ];then MIN_NUM=${num} else echo -e "" fi done echo "输入的参数总共为:$#" echo "输入的数字为:$*" echo "其中最大的数字为:${MAX_NUM}" echo "其中最小的数字为:${MIN_NUM}" 4.4 测试
当我们不输入任何参数,或输入单个参数的时候,提示输入参数错误,至少输入一个数字;
如果输入有包含字符串,则提示参数不规范;
当输入一些列数字的时候,可以得到正确的结果。
[root@master shell_test]# bash num_check.sh 输入参数错误,至少输入一个数字 [root@master shell_test]# bash num_check.sh 1 输入参数错误,至少输入一个数字 [root@master shell_test]# bash num_check.sh 1 "hell" 输入的hell不符合参数规范 [root@master shell_test]# bash num_check.sh 12 13 32 435 0 输入的参数总共为:5 输入的数字为:12 13 32 435 0 其中最大的数字为:435 其中最小的数字为: 4. 注意事项
- 对于关系运算,test 命令比较的对象为数字,不是字符串,一定要牢记这个注意点;
- 对于字符串判断,test 命令作用的为字符串,如果想比较数字,可以利用双引号引起来通过字符串判断。
5. 小结
在本章节由于 test 命令与运算符配合使用,与之前运算符章节有重复,在此温故知新,通过示例来更加熟悉 test 命令及相关运算符,其是后期 Shell 脚本编写的流程框架,熟练掌握 test 命令的数值,文件,字符串与逻辑运算,使得我们编写 Shell 脚本更加得心应手。
KaliArch ·
2026 imooc.com All Rights Reserved |