Shell的条件测试表达式

Shell的条件测试表达式

1 文件测试

[ -e file|dir ]     存在即为真
[  -f file    ]     文件存在即为真
[  -d dir     ]     目录存在即为真
[  -r file    ]     是否有读的权限
[  -w file    ]     是否有写入权限
[  -x file    ]     是否有执行权限
[root@shell ~]# test -f /etc/hosts && echo "文件存在"
文件存在
[root@shell ~]# test -f /etc/hostss && echo "文件存在" || echo "文件不存在"
文件不存在

[root@shell ~]# test -d /etc && echo "文件存在" || echo "文件不存在" 
文件存在
    
[root@shell ~]# ll 1.sh
-rw-r--r-- 1 root root 10 Feb 28 19:29 1.sh
[root@shell ~]# [ -x 1.sh ] && echo "文件存在" || echo "文件不存在"          
文件不存在
[root@shell ~]# chmod +x 1.sh
[root@shell ~]# ll 1.sh
-rwxr-xr-x 1 root root 10 Feb 28 19:29 1.sh
[root@shell ~]# [ -x 1.sh ] && echo "文件存在" || echo "文件不存在" 
文件存在  
[root@shell ~]# [ -r 1.sh ] && echo "文件存在" || echo "文件不存在"  
文件存在
[root@shell ~]# [ -w 1.sh ] && echo "文件存在" || echo "文件不存在"  
文件存在
[root@shell ~]# [ -L 1.sh ] && echo "文件存在" || echo "文件不存在"  
文件不存在
[root@shell ~]# [ -L /etc/rc.local ] && echo "文件存在" || echo "文件不存在" 
取反		
[root@shell ~]# [ ! -f /etc/hosts ] && echo ok || echo error
error

# Shell的函数库:加载functions   
[ -f /etc/init.d/functions ] && . /etc/init.d/functions

2 整数数值比较

[ 整数1 比较符 整数2 ]
[ 10 -eq 10 ]  等于
[ 10 -gt 5  ]  大于
[ 10 -ge 10 ]  大于或等于
[ 10 -lt 20 ]  小于
[ 10 -le 10 ]  小于或等于
[ 10 -ne 20 ]  不等于

注意: 如果是在[[]]或(())中的比较符,使用= != > >= < <=

[root@shell ~]# [ 10 -eq 10 ] && action /bin/true || action /bin/false
/bin/true                                                  [  OK  ]
[root@shell ~]# [ 10 -ne 10 ] && action /bin/true || action /bin/false  
/bin/false                                                 [  OK  ]
[root@shell ~]# [ 10 -gt 10 ] && action /bin/true || action /bin/false  
/bin/false                                                 [  OK  ]
[root@shell ~]# [ 10 -lt 10 ] && action /bin/true || action /bin/false 
/bin/false                                                 [  OK  ]
使用脚本取出当前系统的 主机名称 系统版本 内核版本 虚拟平台 eth0网卡IP地址 外网网卡IP地址(curl cip.cc) 当前内存使用率 磁盘使用率 负载使用情况 
[root@shell ~]# cat os.sh 
#!/bin/sh
HostName=$(hostnamectl |awk 'NR==1{print $3}')
System=$(hostnamectl |grep Operating|awk '{print $3"_"$4"_"$5}')
Kernel=$(hostnamectl |grep Kernel|awk '{print $3}')
VT=$(hostnamectl |grep Virtualization|awk '{print $2}')
Eth0=$(ifconfig eth0|awk 'NR==2{print $2}')
Network_IP=$(curl -s cip.cc|awk 'NR==1{print $3}')
Mem_Use=$(free|awk 'NR==2{print $3/$2*100}')%
Disk_Use=$(df -h|grep '/$'|awk '{print $(NF-1)}')
Load_Use=$(uptime|awk '{print $(NF-2)}')
echo -e "\t\t当前主机名称是: " $HostName
echo -e "\t\t当前的系统版本是: " $System
echo -e "\t\t当前的内核版本是: " $Kernel
echo -e "\t\t当前使用的虚拟平台是: " $VT
echo -e "\t\t当前的eth0网卡IP是: "  $Eth0
echo -e "\t\t当前的外网IP是: "  $Network_IP
echo -e "\t\t当前的内存使用率是: " $Mem_Use
echo -e "\t\t当前的磁盘使用率是: " $Disk_Use
echo -e "\t\t当前的负载使用率是: " $Load_Use

3 多整数比较

-a  and 两端都要成立则为真
-o  or  一端成立则为真
[ 整数1 比较符 整数2 -a 整数3 比较符 整数4 ]
[root@shell ~]# [ 10 -eq 10 -a 20 -gt 10 ] && action /bin/true || action /bin/false
/bin/true                                                  [  OK  ]
[root@shell ~]# [ 10 -ne 10 -a 20 -gt 10 ] && action /bin/true || action /bin/false  
/bin/false                                                 [  OK  ]
[root@shell ~]# [ 10 -ne 10 -o 20 -gt 10 ] && action /bin/true || action /bin/false 
/bin/true                                                  [  OK  ]

注意:[[]]中的和与或使用&& ||

[root@shell ~]# [[ 10 -ne 10 || 20 -gt 10 ]] && action /bin/true || action /bin/false 
/bin/true                                                  [  OK  ]
[root@shell ~]# [[ 10 -ne 10 && 20 -gt 10 ]] && action /bin/true || action /bin/false 
/bin/false                                                 [  OK  ]

4 字符串比对

# 字符串两端加双引号
[ "字符串1" = "字符串2"  ]  等于
[ "字符串1" != "字符串2" ]  不等于
-z 字符串长度为0 则为真
-n 字符串长度不为0 则为真
[root@shell ~]# [ "oldboy" = "oldboy" ] && echo 成立 || echo 不成立
成立
[root@shell ~]# [ "oldboy" != "root" ] && echo 成立 || echo 不成立 
成立
	
[root@shell ~]# [ "$USER" = "root" ] && echo 成立 || echo 不成立
成立
[root@shell ~]# [ "$USER" = "oldboy" ] && echo 成立 || echo 不成立 
不成立
[root@shell ~]# [ "$USER" != "oldboy" ] && echo 成立 || echo 不成立
成立
[root@shell ~]# oldboy="test"
[root@shell ~]# echo $oldboy
test
[root@shell ~]# [ -z "$oldboy" ] && echo ok || echo error
error
[root@shell ~]# [ -n "$oldboy" ] && echo ok || echo error 
ok

5 正则比对

语法格式:
[[ "字符串" 正则匹配 "字符串" ]]	
[root@shell ~]# [[ "root" =~ ^r ]] && echo 成立|| echo 不成立
成立
[root@shell ~]# 
[root@shell ~]# [[ "root" =~ ^o ]] && echo 成立|| echo 不成立 
不成立
[root@shell ~]# [[ "root" =~ t$ ]] && echo 成立|| echo 不成立 
成立
  • 使用正则对传参的数字进行判断
[root@shell ~]# cat expr.sh 
#!/bin/sh
[ $# -ne 2 ] && echo "请输入两个整数" && exit
[[  "$1" =~ ^[0-9]+$ && "$2" =~ ^[0-9]+$ ]] || exit
#[[ ! "$2" =~ ^[0-9]+$ ]] && echo "请输入整数" && exit
[ $1 -gt $2 ] && echo "$1 > $2"
[ $1 -lt $2 ] && echo "$1 < $2"
[ $1 -eq $2 ] && echo "$1 = $2"
    
[root@shell ~]# cat expr.sh 
#!/bin/sh
[ $# -ne 2 ] && echo "请输入两个整数" && exit
[[ ! "$1" =~ ^[0-9]+$ ]] && echo "请输入整数" && exit
[[ ! "$2" =~ ^[0-9]+$ ]] && echo "请输入整数" && exit
[ $1 -gt $2 ] && echo "$1 > $2"
[ $1 -lt $2 ] && echo "$1 < $2"
[ $1 -eq $2 ] && echo "$1 = $2"
    
[root@shell /server/scripts]# cat check_inter.sh 
#!/bin/bash
read -p "请输入第一个整数:" NUM1
read -p "请输入第二个整数:" NUM2
expr $NUM1 + $NUM2 &>/dev/null
[ $? -ne 0 ] && echo "请输入整数!" && exit
[ $NUM1 -eq $NUM2 ] && echo "数值比较结果:$NUM1 = $NUM2"
[ $NUM1 -gt $NUM2 ] && echo "数值比较结果:$NUM1 > $NUM2"
[ $NUM1 -lt $NUM2 ] && echo "数值比较结果:$NUM1 < $NUM2"