Shell编程之条件语句
条件测试
文件测试与整数测试
-
test命令
- 测试表达式是否成立,成立返回0,否则返回其他数值
- 格式1:
test 条件表达式 //注意比较符号加空格
- 格式2:
[ 条件表达式 ] //条件表达式左右要有空格
- 格式1:
- 测试表达式是否成立,成立返回0,否则返回其他数值
-
文件测试
-
[ 操作符 文件或目录 ]
-
常用的测试操作符(成立返回0,否则返回其他值)(引申也可以判断文件是否存在)
- -d:测试是否为目录(Directory)
- -e:测试目录或文件是否存在(Exist)
- -f:测试是否为文件(File)
- -r:测试当前用户是否有权限读取(Read)
- -w:测试当前用户是否有权限写入(Write)
- -x:测试当前用户是否有权限执行(Excute)
- -L:测试是否为符号链接
[ 操作符 文件或目录 ] && echo "YES" //&&前面表达式成立才会执行echo
-
-
整数值比较
-
[ 整数变量 操作符 整数变量 ]
-
常用的测试操作符
-
-eq:等于(Equal)
-
-ne:不等于(Not Equal)
-
-gt :大于(Greater Than)
-
-lt :小于(Lesser Than)
-
-le :小于或等于(Lesser or Equal)
-
-ge:大于或等于(Greater or Equal)
[ $(who | wc -l) -gt 5] && echo "Too many." //用户数大于5则输出Too many
[ $(who | wc -l) -ge 5] && echo ">=5" //用户数大于等于5则输出>=5
# 内存空间是否小于1024 FreeCC=$(free -m | grep "Mem:" | awk '{print $4}') [ $FreeCC -lt 1024 ] && echo ${FreeCC}MB
# 计算内存使用率 USED=$(free | grep "Mem:" | awk '{print $3}') TOTAL=$(free | grep "Mem:" | awk '{print $2}') # USED_PRE=$(echo "scale=2;$USED/$TOTAL*100" | bc |awk -F. '{print $1}') USED_PRE=$(awk "BEGIN {print $USED/$TOTAL*100}" |awk -F. '{print $1}')
-
-
字符串测试与逻辑测试
-
字符串比较
-
格式1:[ 字符串1 = 字符串2 ] [ 字符串1 != 字符串2 ]
-
格式2:[ -z 字符串 ]
-
常用的测试操作符
- =:字符串内容相同
- !=:字符串内容不同
- -z:字符串长度是否为0(为0时返回true),对于未定义或赋予空值的变量将视为空串
- -n:判断字符串是否不为0(不为0返回true),(需要用双引号引用字符串)
[ -z $(cat abc.txt) ] //判断文件是否为空
[ -z $abc ] //判断变量是否有值
[ -n "$abc" ] //判断变量是否为空
-
-
逻辑测试
-
格式1:
[ 表达式1 ] 操作符 [ 表达式2 ] ...
(操作符只能用&&或者||) -
格式2:
[ 命令1 操作符 命令2 ... ]
(操作符只能用-a或者-o) -
常用的测试操作符
- -a或&&:逻辑与,“而且”的意思(都成立才成立)
- -o或||:逻辑或,“或者”的意思(成立一个即成立)
- !:逻辑否
[ $a -eq 5 ] && [ $a -ne 10 ]
相当于[ $a -wq 5 -a $a -ne 10]
想在同一个表达式中使用&&和||,要用[[ ]]括起来
[ 2 -lt 3 ] && echo true || echo false //2小于3时执行echo true否则执行echo false,类似编程语言的三元运算符
#!/bin/bash #自动探测目标主机是否存活 ping -c 3 -i 0.5 -w 2 $1 &> /dev/null && echo "$1 online" || echo "$1 offline" #指定3个包,间隔0.5s,最多等待2s
-
if语句
if单分支语句
-
格式
if 条件测试操作 then 命令序列 fi
-
例
#!/bin/bash # 单分支实现磁盘使用率过高报警 USAGE=`df | grep "/dev/sda2" | awk '{print $5}' | awk -F% '{print $1}'` if [ $USAGE -gt 70 ] then echo "警告!当前磁盘使用率过高,已达到${USAGE}%" fi
if双分支语句
-
格式
if 条件测试操作 then 命令序列1 else 命令序列2 fi
-
例
#!/bin/bash # 双分支实现httpd服务的自动安装启动 netstat -natp | grep :80 &> /dev/null # 查看端口状态 if [ $? -eq 0 ] then echo "网站服务已运行!" else rpm -q httpd &> /dev/null # 查看服务是是否已经安装 if [ $? -eq 0] then echo "httpd服务已安装,正在开启服务......" systemctl start httpd else echo "正在安装httpd服务,并准备启动......" yum install -y httpd &> /dev/null # 默认已安装yum仓库 systemctl start httpd fi fi
if多分支语句
-
格式
if 条件测试操作 then 命令序列1 elif 条件测试操作2 then 命令序列2 else 命令序列3 fi
-
例
#!/bin/bash # 多分支实现成绩分析 read -p "请输入你的分数(0-100):" score if [ $score -eq 100 ] then echo "100分,非常优秀!" elif [ $score -ge 90 ] && [ $score -lt 100 ] then echo "$score分,很优秀。" elif [ $score -ge 70 ] && [ $score -lt 90 ] then echo "$score分,良好。" elif [ $score -ge 60 ] && [ $score -lt 70 ] then echo "$score分,及格。" elif [ $score -ge 0 ] && [ $score -lt 60 ] then echo "$score分,不及格。" else echo "输入有误" fi
case分支语句
-
case多分支结构
case 变量值 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; ...... *) 默认命令序列 esac
-
例
#!/bin/bash # case分支改写上一实验 read -p "xx+(0-100):" score case $score in 100) echo "100分,非常优秀!" ;; 9[0-9]) # 90~99分 echo "$score分,很优秀。" ;; [78][0-9]) # 70~89分 echo "$score分,良好。" ;; 6[0-9]) # 60~69分 echo "$score分,及格。" ;; [0-9]|[1-5][0-9]) # 0~9分和10到59分 echo "$score分,不及格。" ;; *) echo "输入有误" esac
-
使用case编写一个自定义service服务
cd /etc/init.d
vim firewalld
#!/bin/bash # chkconfig 2345 99 20 case $1 in start) systemctl start firewalld ;; stop) systemctl stop firewalld ;; restart) $0 stop $0 start ;; status) systemctl status firewalld ;; *) echo "Usage: $0 {start|stop|resatrt|status}" esac
chmod +x firewalld
chkconfig --add firewalld
service firewalld stop //测试关闭命令
service firewalld status //测试命令
systemctl status firewalld //测试命令
service firewalld start //测试命令
systemctl status firewalld //测试命令