条件测试:
判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成
测试结果:
-
若真,则状态码变量 $? 返回0
-
若假,则状态码变量 $? 返回1
条件测试命令:
test和[ ]
test和 `]`等价
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
[[ EXPRESSION ]] 相当于增强版的 [ ], 支持[]的用法,且支持扩展正则表达式和通配符
测试变量:
-v 判断 NAME 变量是否定义
-R 判断 NAME 变量是否定义并且是名称引用,bash 4.4新特性
[root@CentOS7 ~]# test -v NUM ; echo $?
0
[root@CentOS7 ~]# test -v xx ; echo $?
1
数值测试:
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-ge 是否大于等于
-lt 是否小于
-le 是否小于等于
[root@CentOS7 ~]# i=10;j=11
[root@CentOS7 ~]# test $i -eq $j ; echo $?
1
[root@CentOS7 ~]# test $i -ne $j ; echo $?
0
[root@CentOS7 ~]# test $i -lt $j ; echo $?
0
字符串测试
-z STRING 字符串是否为空,没定义或空为真,不空为假,
-n STRING 字符串是否不空,不空为真,空为假
STRING1 = STRING2 是否等于,注意 = 前后有空格
[[]] 用法:
[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
范例:使用 [[ ]] 判断文件后缀
#通配符
[root@centos8 ~]#FILE=test.log
[root@centos8 ~]#[[ "$FILE" == *.log ]]
[root@centos8 ~]#echo $?
0
#正则表达式
[root@centos8 ~]#FILE=test.log
[root@centos8 ~]#[[ "$FILE" =~ \.log$ ]]
[root@centos8 ~]#echo $?
0
文件测试;
-a FILE:同 -e
-e FILE: 文件存在性测试,存在为真,否则为假
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
例如:
[root@CentOS7 ~]# test -a /etc/fstab ; echo $?
0
[root@CentOS7 ~]# test -a /etc/fstabxx ; echo $?
1
文件权限测试:
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
例如:
[root@CentOS7 ~]# test -w /etc/fstab ;echo $?
0
[root@CentOS7 ~]# test -k /etc/fstab ;echo $?
1
文件属性测试:
-s FILE #是否存在且非空
-t fd #fd 文件描述符是否在某终端已经打开
-N FILE #文件自从上一次被读取之后是否被修改过
-O FILE #当前有效用户是否为文件属主
-G FILE #当前有效用户是否为文件属组
FILE1 -ef FILE2 #FILE1是否是FILE2的硬链接
FILE1 -nt FILE2 #FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2 #FILE1是否旧于FILE2
标签:语句,shell,是否,echo,CentOS7,FILE,test,root
From: https://www.cnblogs.com/heyongshen/p/16802460.html