shell中test命令的⽤法详解
1. test命令
test 是 Shell 内置命令,⽤来检测某个条件是否成⽴。test 通常和 if 语句⼀起使⽤,并且⼤部分 if 语句都依赖 test。test 命令有很多选项,可以进⾏数值、字符串和⽂件三个⽅⾯的检测。
Shell test 命令的⽤法为:
test expression
当 test 判断 expression 成⽴时,退出状态为 0,否则为⾮ 0 值
test 命令也可以简写为[],它的⽤法为:[ expression ]
eg:
注意[]和expression之间的空格,这两个空格是必须的,否则会导致语法错误。[]的写法更加简洁,⽐ 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选项表⽰⼤于等于,&&是逻辑与运算符
2. 与⽂件检测相关的 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 权限
-r filename判断⽂件是否存在,并且是否拥有读权限
⽂件⽐较
filename1 -nt
filename2
判断 filename1 的修改时间是否⽐ filename2 的新filename -ot filename2判断 filename1 的修改时间是否⽐ filename2 的旧
filename1 -ef filename2判断 filename1 是否和 filename2 的 inode 号⼀致,可以理解为两个⽂件是否为同⼀个⽂件。这个判断⽤于判断硬链接是
很好的⽅法
Shell 中test ⽂件检测举例
test.sh
#!/bin/bash
read filename
read url
if test -w $filename&&test -n $url
then
echo$url>$filename
echo"写⼊成功"
else
echo"写⼊失败"
fi
测试结果:
[root@server1 mnt]# touch dd
[root@server1 mnt]# sh test.sh
dd
<
写⼊成功
[root@server1 mnt]# cat dd
<
3.与数值⽐较相关的 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 命令
eg:test.sh
#!/bin/bash
read a b
if test$a -eq $b
then
echo"两个数相等"
else
echo"两个数不相等"
fi
测试结果:
[root@server1 mnt]# sh test.sh
2 3
两个数不相等
4.与字符串判断相关的 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、Java 等编程经验的读者请注意,==、>、< 在⼤部分编程语⾔中都⽤来⽐较数字,⽽在 Shell 中,它们 只能⽤来⽐较字符串,不能⽐较数字,这是⾮常奇葩的,⼤家要习惯
#其次,不管是⽐较数字还是字符串,Shell 都不⽀持 >= 和 <= 运算符,切记
eg: test.sh
#!/bin/bash
read str1
read str2
#检测字符串是否为空
if[ -z "$str1"]||[ -z "$str2"]
then
echo"字符串不能为空"
exit 0
fi
#⽐较字符串
if[$str1=$str2]
then
echo"两个字符串相等"
else
echo"两个字符串不相等"
fi
#变量 $str1 和 $str2 都被双引号包围起来,这样做是为了防⽌ $str1 或者 $str2 是空字符串时出现错误
测试:
[root@server1 mnt]# sh test.sh
字符串不能为空
[root@server1 mnt]# sh test.sh
1
字符串不能为空
[root@server1 mnt]# sh test.sh
2
字符串不能为空
[root@server1 mnt]# sh test.sh
shell代码
redhat
redhat
两个字符串相等
[root@server1 mnt]# sh test.sh
redhat
shell
两个字符串不相等
5.与逻辑运算相关的 test 选项
expression1 -a expression 逻辑与,表达式 expression1 和 expression2 都成⽴,最终的结果才是成⽴的。
expression1 -o expression2 逻辑或,表达式 expression1 和 expression2 有⼀个成⽴,最终的结果就成⽴。
!expression 逻辑⾮,对 expression 进⾏取反
改写上⾯的代码,使⽤逻辑运算选项
[root@server1 mnt]# cat test.sh
#!/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 和 [] 都是命令,⼀个命令本质上对应⼀个程序或者⼀个函数。=
假设 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是空字符串时,test−z"
如果我们给 $str1 变量加上双引号,当 str1"就会被替换为test -z “”,调⽤ func() 函数的形式就是func("-z " “”),很显然,-z选项后⾯跟的是⼀个空字符串(\“表⽰转义字符),这样 func() 在分析时就不会出错了
“””
总结:
test 命令⽐较奇葩,>、<、== 只能⽤来⽐较字符串,不能⽤来⽐较数字,⽐较数字需要使⽤ -eq、-gt 等选项;不管是⽐较字符串还是数字,test 都不⽀持 >= 和 <=。有经验的程序员需要慢慢习惯 test 命令的这些奇葩⽤法。
对于整型数字的⽐较,我建议⼤家使⽤ (()),(()) ⽀持各种运算符,写法也符合数学规则,⽤起来更加⽅便

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。