条件表达式,我们非常的常用,可以说,任何编程语言,都离不开条件表达式,但是每种变成语言的写法都不太一样,在shell中,有一种独特的写法。
条件表达式
条件测试语句,我们又叫做test
语句
格式 | 格式 |
---|---|
test <条件> | 常规判断命令 |
[[ <条件> ]] | 支持运算符和正则的条件表达式 |
[ <条件> ] | 常用条件表达式 |
文件表达式
表达式 | 含义 | 举例 |
---|---|---|
-d | 判断目录是否存在 | test -d /etc |
-f | 判断文件是否存在 | test -f /etc/hosts |
-e | 判断是否存在 | test -e /etc |
-r | 判断文件是否存在,并且有read权限 | test -r /etc/hosts |
-w | 判断文件是否存在,并且有write权限 | test -w /etc |
-x | 判断文件是否存在,并且有execute权限 | test -x /bin/ls |
-s | 判断文件是否存在,并且size是否大于0 | test -s /etc/passwd |
-L | 判断文件是否存在,并且是否是软链接文件 | test -L /bin |
file -nt file2 | file1是否比file2更新,newer than | test 1.txt -nt 2.txt |
file -ot file2 | file1是否比file2更旧,older than | test 1.txt -ot 2.txt |
# 1.判断目录是否存在
[root@zabbix01 ~]# test -d /etc && echo '存在' || '不存在'
存在
[root@zabbix01 ~]# [ -d /etc ] && echo '存在' || '不存在'
存在
[root@zabbix01 ~]# [[ -d /etc ]] && echo '存在' || '不存在'
存在
# 2.判断文件是否存在
[root@zabbix01 ~]# [[ -f /etc/hosts ]] && echo '存在' || echo '不存在'
存在
[root@zabbix01 ~]# [ -f /etc/hosts ] && echo '存在' || echo '不存在'
存在
[root@zabbix01 ~]# test -f /etc/hosts && echo '存在' || echo '不存在'
存在
# 3.判断是否存在,不区分目录或文件
[root@zabbix01 ~]# test -e /etc/hosts && echo '存在' || echo '不存在'
存在
[root@zabbix01 ~]# [ -e /etc/hosts ] && echo '存在' || echo '不存在'
存在
[root@zabbix01 ~]# [[ -e /etc/hosts ]] && echo '存在' || echo '不存在'
存在
# 4.判断权限,注意如果是root用户,只能判断出来执行权限,使用普通用户即可
[root@zabbix01 ~]# ll /etc/shadow
---------- 1 root root 791 Aug 17 19:57 /etc/shadow
[root@zabbix01 ~]# [ -x /etc/shadow ] && echo '存在' || echo '不存在'
不存在
[root@zabbix01 ~]# [ -r /etc/shadow ] && echo '存在' || echo '不存在'
存在
[root@zabbix01 ~]# [ -w /etc/shadow ] && echo '存在' || echo '不存在'
存在
# 5.判断文件是否为空
[root@zabbix01 ~]# echo 123 >1.txt
[root@zabbix01 ~]# touch 2.txt
[root@zabbix01 ~]# [ -s 1.txt ] && echo '不为空' || echo '空文件'
不为空
[root@zabbix01 ~]# [ -s 2.txt ] && echo '不为空' || echo '空文件'
空文件
# 6.判断文件是否是软链接文件
[root@zabbix01 ~]# [ -L /bin ] && echo '软链接' || echo '非软链接'
软链接
# 7.判断文件新或旧 (修改时间)
[root@zabbix01 ~]# [ 1.txt -nt 2.txt ] && echo '1.txt比2.txt更新' || echo '2.txt比1.txt更新'
2.txt比1.txt更新
[root@zabbix01 ~]# [ 1.txt -ot 2.txt ] && echo '1.txt比2.txt更旧' || echo '2.txt比1.txt更旧'
1.txt比2.txt更旧
## 条件表达式使用格式
[ 条件 ] && cmd
[ 条件 ] && {
cmd1
cmd2
}
字符串表达式
介绍
注意:大写的注意,在shell脚本中所有变量的调用,请一定加上双引号,尤其是和字符串相关的,
-n 判断字符串是否为空
test -n :与-z相反,字符串为空时假,不为空时为真
[root@web02 test]# test -n "$abc"
[root@web02 test]# echo $?
1
[root@web02 test]# abc=123
[root@web02 test]# test -n "$abc"
[root@web02 test]# echo $?
0
test -Z :判断字符串是否为空,空为真,反之为假
[root@web02 test]# test -z "$abcd" && echo '字符串为空' || echo '字符串不为空'
字符串不为空
"str1" = "str2"
[root@web02 test]# test 'abc' = 'abc' && echo '字符相等' || echo '字符不等'
字符相等
[root@web02 test]# test 'abc' = 'abz' && echo '字符相等' || echo '字符不等'
字符不等
"str1" != "str2"
[root@web02 test]# test 'abc' != 'abz' && echo '字符不等' || echo '字符相等'
字符不等
[root@web02 test]# test 'abc' != 'abc' && echo '字符不等' || echo '字符相等'
字符相等
整数表达式
表达式 | 含义 | test举例 | [[]]举例 |
---|---|---|---|
-eq | equal 等于 | test 2 -eq 2 | [[ 2 -eq 2 ]] |
-ne | not equal 不等于 | test 2 -ne 2 | [[ 2 != 2 ]] |
-gt | great than 大于 | test 2 -gt 2 | [[ 2 > 2 ]] |
-lt | less than 小于 | test 2 -lt 2 | [[ 2 < 2 ]] |
-ge | great equal 大于等于 | test 2 -ge 2 | [[ 2 >= 2 ]] |
-le | less equal 小于等于 | test 2 -le 2 | [[ 2 <= 2 ]] |
[root@web02 test]# [ 2 > 1 ] && echo '成功' || echo '失败'
成功
[root@web02 test]# [[ 2 >= 1 ]] && echo '成功' || echo '失败'
bash: syntax error in conditional expression
bash: syntax error near `1'
# 单括号有时候会把>识别为重定向
[root@web02 test]# [ $age > 20 ] && echo '成功' || echo '失败'
失败
[root@web02 test]# age=20
[root@web02 test]# [ $age \> 10 ] && echo '成功' || echo '失败' //使用\转义符
成功
[root@web02 test]# ll
total 8
-rw-r--r-- 1 root root 0 Jun 28 11:22 1
-rw-r--r-- 1 root root 0 Jun 28 11:25 20
-rw-r--r-- 1 root root 670 Jun 28 11:00 jsq.sh
-rw-r--r-- 1 root root 487 Jun 28 10:22 mxjsq.sh
[root@web02 test]# [ $age \> 10 ] && echo '成功' || echo '失败'
成功
[root@web02 test]# [ $age \> 3 ] && echo '成功' || echo '失败'
失败
[root@web02 test]# [ $age \> 10 ] && echo '成功' || echo '失败'
成功
[root@web02 test]# [ $age -gt 10 ] && echo '成功' || echo '失败'
失败
[[]]的成员运算
=~:成员运算
# 前面的值包不包含后面你的输入
[root@web02 test]# name=dongdong
[root@web02 test]# [[ $name =~ 'd' ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ 'i' ]] && echo '包含' || echo '不包含'
不包含
[root@web02 test]# [[ $name =~ 'do' ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ [0-9] ]] && echo '包含' || echo '不包含'
不包含
[root@web02 test]# [[ $name =~ [a-z] ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ ^[a-z] ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ [a-z]$ ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ ^[a-z]$ ]] && echo '包含' || echo '不包含'
不包含
[root@web02 test]# [[ $name =~ ^[a-z]+$ ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ 'g'$ ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ 'd'$ ]] && echo '包含' || echo '不包含'
不包含
逻辑运算表达式
逻辑运算表达式介绍
表方式 | 含义 | 符号 |
---|---|---|
! | 非,取反 | ! |
&& | 与 | -a |
|| | 或 | -o |
and条件
只有都为真,条件才为真,条件中有任何一个为假,那么结果就是假
逻辑符号 条件一 条件二 结果
真 真 真
-a 真 假 假
假 真 假
假 假 假
-or条件
只要有一个为真,结果就是真,除非两个都为假,结果才是假。
逻辑符号 条件一 条件二 结果
真 真 真
-o 真 假 真
假 真 真
假 假 假