shell中test命令的用法详解

shell中test命令的用法详解

2023年8月2日发(作者:)

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/bashread ageif 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-r filename-g filename-k filename判断⽂件是否存在,并且是否拥有 SUID 权限。判断⽂件是否存在,并且是否拥有读权限判断⽂件是否存在,并且是否拥有 SGID 权限。判断该⽂件是否存在,并且是否拥有 SBIT 权限⽂件⽐较filename1 -ntfilename2filename -ot filename2判断 filename1 的修改时间是否⽐ filename2 的新判断 filename1 的修改时间是否⽐ filename2 的旧判断 filename1 是否和 filename2 的 inode 号⼀致,可以理解为两个⽂件是否为同⼀个⽂件。这个判断⽤于判断硬链接是很好的⽅法filename1 -ef filename2Shell 中test ⽂件检测举例#!/bin/bashread filenameread urlif test -w $filename && test -n $urlthen echo $url > $filename echo "写⼊成功"else echo "写⼊失败"fi测试结果:[root@server1 mnt]# touch dd[root@server1 mnt]# sh

写⼊成功[root@server1 mnt]# cat dd

3.与数值⽐较相关的 test 选项num1 -eq num2num1 -ne num2num1 -gt num2num1 -lt num2num1 -ge num2num1 -le num2判断 num1 是否和 num2 相等判断 num1 是否和 num2 不相等判断 num1 是否⼤于 num2判断 num1 是否⼩于 num2判断 num1 是否⼤于等于 num2判断 num1 是否⼩于等于 num2#注意,test 只能⽤来⽐较整数,⼩数相关的⽐较还得依赖 bc 命令eg:#!/bin/bashread a bif test $a -eq $bthen echo "两个数相等"else echo "两个数不相等"fi测试结果:[root@server1 mnt]# sh

2 3两个数不相等4.与字符串判断相关的 test 选项z str-n strstr1 = str2与str1 == str2str1 != str2str1 > str2str1 < str2判断字符串 str 是否为空判断宇符串 str 是否为⾮空=和==是等价的,都⽤来判断 str1 是否和 str2 相等。判断 str1 是否和 str2 不相等。判断 str1 是否⼤于 str2。>是>的转义字符,这样写是为了防⽌>被误认为成重定向运算符。判断 str1 是否⼩于 str2。同样,<也是转义字符注意:#有C语⾔、C++、Python、Java 等编程经验的读者请注意,==、>、< 在⼤部分编程语⾔中都⽤来⽐较数字,⽽在 Shell 中,它们 只能⽤来⽐较字符串,不能⽐较数字,这是⾮常奇葩的,⼤家要习惯#其次,不管是⽐较数字还是字符串,Shell 都不⽀持 >= 和 <= 运算符,切记eg: #!/bin/bashread str1read str2#检测字符串是否为空if [ -z "$str1" ] || [ -z "$str2" ]then echo "字符串不能为空" exit 0fi#⽐较字符串if [ $str1 = $str2 ]then echo "两个字符串相等"else echo "两个字符串不相等"fi#变量 $str1 和 $str2 都被双引号包围起来,这样做是为了防⽌ $str1 或者 $str2 是空字符串时出现错误测试:[root@server1 mnt]# sh

字符串不能为空[root@server1 mnt]# sh

1字符串不能为空[root@server1 mnt]# sh

2字符串不能为空[root@server1 mnt]# sh

redhatredhat两个字符串相等[root@server1 mnt]# sh

redhatshell两个字符串不相等5.与逻辑运算相关的 test 选项expression1 -a expression 逻辑与,表达式 expression1 和 expression2 都成⽴,最终的结果才是成⽴的。expression1 -o expression2 逻辑或,表达式 expression1 和 expression2 有⼀个成⽴,最终的结果就成⽴。!expression 逻辑⾮,对 expression 进⾏取反改写上⾯的代码,使⽤逻辑运算选项[root@server1 mnt]# cat

#!/bin/bashread str1read str2#检测字符串是否为空if [ -z "$str1" -o -z "$str2" ] #使⽤ -o

选项取代之前的 ||then echo "字符串不能为空" exit 0fi#⽐较字符串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 变量加上双引号,当

str1是空字符串时,test−z"str1"就会被替换为test -z “”,调⽤ func() 函数的形式就是func("-z " “”),很显然,-z选项后⾯跟的是⼀个空字符串(“表⽰转义字符),这样 func() 在分析时就不会出错了“””总结:test 命令⽐较奇葩,>、<、== 只能⽤来⽐较字符串,不能⽤来⽐较数字,⽐较数字需要使⽤ -eq、-gt 等选项;不管是⽐较字符串还是数字,test 都不⽀持 >= 和 <=。有经验的程序员需要慢慢习惯 test 命令的这些奇葩⽤法。对于整型数字的⽐较,我建议⼤家使⽤ (()),(()) ⽀持各种运算符,写法也符合数学规则,⽤起来更加⽅便

发布者:admin,转转请注明出处:http://www.yc00.com/web/1690917090a462969.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信