test expression
当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值。[],它的用法为:
[ 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选项表示大于等于,&&是逻辑与运算符。| 文件类型判断 | |
|---|---|
| 选 项 | 作 用 |
| -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 号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 |
#!/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 脚本,运行结果为:| 选 项 | 作 用 |
|---|---|
| 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。 |
#!/bin/bash
read a b
if test $a -eq $b
then
echo "两个数相等"
else
echo "两个数不相等"
fi
运行结果1:| 选 项 | 作 用 |
|---|---|
| -z str | 判断字符串 str 是否为空。 |
| -n str | 判断宇符串 str 是否为非空。 |
|
str1 = str2 str1 == str2 |
=和==是等价的,都用来判断 str1 是否和 str2 相等。 |
| str1 != str2 | 判断 str1 是否和 str2 不相等。 |
| str1 \> str2 |
判断 str1 是否大于 str2。\>是>的转义字符,这样写是为了防止>被误认为成重定向运算符。 |
| str1 \< str2 |
判断 str1 是否小于 str2。同样,\<也是转义字符。 |
#!/bin/bash
read str1
read str2
#检测字符串是否为空
if [ -z "$str1" ] || [ -z "$str2" ]
then
echo "字符串不能为空"
exit 0
fi
#比较字符串
if [ $str1 = $str2 ]
then
echo "两个字符串相等"
else
echo "两个字符串不相等"
fi
运行结果:| 选 项 | 作 用 |
|---|---|
| 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 -z $str1命令时,会先将变量 $str1 替换成字符串:
test -z abc123,调用 func() 函数的形式就是func("-z abc123")。test 命令后面附带的所有选项和参数会被看成一个整体,并作为实参传递进函数。test -z ,调用 func() 函数的形式就是func("-z "),这就比较奇怪了,因为-z选项没有和参数成对出现,func() 在分析时就会出错。test -z "$str1"就会被替换为test -z "",调用 func() 函数的形式就是func("-z \"\""),很显然,-z选项后面跟的是一个空字符串(\"表示转义字符),这样 func() 在分析时就不会出错了。""包围起来,这样能避免变量为空值时导致的很多奇葩问题。
[[ ]];[[ ]]不是命令,而是 Shell 关键字,下节《Shell [[]]》我们将会讲解。
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有