shell test命令及逻辑测试

110 阅读1分钟

测试 text

test测试文件表达式是否成立,test 命令有很多选项,可以进行数值、字符串和文件三个方面的检测

格式1:test  条件表达式
格式2[  条件表达式  ]
注意[]空格,否则会失败
测试 是否成功使用 $?  返回值
[ 操作符 文件或目录 ]
help test

文件测试

操作符:
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-a:测试目录或文件是否存在(Exist)   
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
-L: 测试是否为软连接文件

属性测试补充:
-s FILE #是否存在且非空
-t fd #fd 文件描述符是否在某终端已经打开
-N FILE #文件自从上一次被读取之后是否被修改过
-O FILE #当前有效用户是否为文件属主
-G FILE #当前有效用户是否为文件属

条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成

测试过程,实现评估布尔声明,以便用在条件性环境下进行执行

若真,则状态码变量 $? 返回0

若假,则状态码变量 $? 返回1

举例:

[root@localhost ~]# [ -d /etc/ ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -f /etc/passwd ]
[root@localhost ~]# echo $?
0
[root@localhost ~]#ll /etc/shadow
---------- 1 root root 1549 1019 10:58 /etc/shadow
[root@localhost ~]#[ -r /etc/shadow ]
[root@localhost ~]#echo $?
0
#实际效果,不是表面显示,注意root权限
[root@localhost ~]#[ -x /etc/shadow ]
[root@localhost ~]#echo $?
1
#root执行权限别人没有root也没有,别人有root也有
#a 和 e  的区别 
[root@localhost ~]#[ ! -e /etc/shadow ]
[root@localhost ~]#echo $?
1
[root@localhost ~]#[ ! -a /etc/shadow ]
[root@localhost ~]#echo $?
0
#取反的时候-a错误,建议用-e

2比较整数数值

[ 整数1 -操作符 整数2 ] 公式

  • -eq:第一个数等于(Equal)第二个数
  • -ne:第一个数不等于(Not Equal)第二个数
  • -gt:第一个数大于(Greater Than)第二个数
  • -lt:第一个数小于(Lesser Than)第二个数
  • -le:第一个数小于或等于(Lesser or Equal)第二个数
  • -ge:第一个数大于或等于(Greater or Equal)第二个数
[root@localhost ~]# a=10
[root@localhost ~]# b=5
[root@localhost ~]# [ $a -eq $b ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ $a -lt $b ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ $a -gt $b ]
[root@localhost ~]# echo $?
0

3字符串比较

常用的测试操作符

  • =:字符串内容相同
  • !=:字符串内容不同,! 号表示相反的意思
  • -z:字符串内容为空
  • -n: 字符是否存在

格式

[ 字符串1 = 字符串2 ] 是否相同

[ 字符串1 != 字符串2 ] 是否不相同

[ -z 字符串 ] 是否为空

[ -n 字符串 ] 字符是否存在

[root@localhost ~]# str1=ikun
[root@localhost ~]# str2=man
[root@localhost ~]# [ $str1 = $str2 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ $str1 != $str2 ]
[root@localhost ~]# echo $?
0

4逻辑测试

格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ... 格式2:命令1 操作符 命令2 ...

第一个要真 第二 个也要真 才能是真

如果第一个为假 ,整个 就为假 不用执行下个操作

cmd1 && cmd2

一 真即为真

如果第一个 为真 那么 不用执行第二个

第一个为假 ,才需要执行第二个

cmd1 || cmd2

写一个磁盘使用量提醒

/dev/sda1               1014M  178M  837M   18% /boot
df|grep "sd"|tr -s " "|cut -d " " -f5|cut -d "%" -f1 
18

image.png

image.png