zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

shell的条件测试语句:test

2023-02-18 16:34:38 时间

条件测试:

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

测试结果:

  • 若真,则状态码变量 $? 返回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