Shell脚本------条件语句(条件测试,if语句,case语句)
Posted 下雨天的放羊娃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本------条件语句(条件测试,if语句,case语句)相关的知识,希望对你有一定的参考价值。
一.条件测试
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0(真true)时表示成功,返回值为非0值(假false)时表示失败或异常。
1.test命令
测试表达式是否成立,若成立返回0,否则返回其他数值
格式1: test 条件表达式
格式2: [ 条件表达式 ] 中括号两边要有空格
常用的测试操作符
测试操作符 | 测试内容 |
---|---|
-d | 测试是否为目录(Directory) |
-e | 测试目录或文件是否存在(Exist) |
-f | 测试是否为文件(File) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否具有权限执行(eXcute) |
-L | 测试是否为符号链接 |
2.整数值比较
[ 整数1 操作符 整数2 ]
常用的测试操作符
测试操作符 | 含义 |
---|---|
-eq | 等于(Equal) |
-ne | 不等于(Not Equal) |
-gt | 大于(Greater Than) |
-lt | 小于(Lesser Than) |
-ge | 大于或等于(Greater or Equal) |
-le | 小于或等于(Greater or Equal) |
who | wc -l 统计当前系统中的用户
[$(who | wc -l)-lt 5]&& echo "Yes" 用户数是否<5
[$(who | wc -l)-ge 3]&& echo "ya" 用户数是否>=3
free -m #查看内存使用情况,单位为MB
Free1=$(free -m | grep "Mem:" | awk '{print $4}') 定义变量名Free1的变量值为以MB为单位显示内存情况,过滤出Mem行的内容,并且打印出第四列的内容
[ $Free1 -lt 1024 ]&& echo "当前空闲内存为${Free1}MB" 显示空闲内存是否小于1024MB,并且输出当前空闲内存的大小
浮点运算需要,要借助bc或awk处理
free -m 查看当前系统的内存使用情况,以MB为单位
Total1=$(free -m | grep "Mem:" |awk '{print $2}') 定义变量名Total1的变量值为以MB为单位显示内存情况,过滤出Mem行的内容,并且打印出第二列的内容
Free1=$(free -m | grep "Mem:" |awk '{print $4}') 定义变量名Free1的变量值为以MB为单位显示内存情况,过滤出Mem行的内容,并且打印出第四列的内容
free=$(free -m | grep "Mem:" | awk '{print $4/$2}')
echo $free 借助awk查看内存空闲率=空闲内存\\总内存
echo “scale=5;${Free1}/${Total1}” | bc 借助bc查看内存空闲率
3.字符串比较
格式一: [ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式二:[ -z 字符串 ]
常用的测试操作符
测试操作符 | 含义 |
---|---|
= | 字符串内容相同 |
!= | 字符串内容不同,!号表示相反的意思 |
-z | 字符串内容为空 |
echo $LANG
[ $LANG = "zh_CN.UTF-8"]&& echo "Yes" 测试当前语言环境,是中文时显示yes
[ $LANG != "en.US"]&& echo "Yes" 测试当前语言环境,不是英文是时显示yes
4.逻辑测试
格式1: [ 表达式1 ] 操作符 [ 表达式2 ] ……
格式2:命令1 操作符 命令2 ……
常用的测试操作符
测试操作符 | 含义 |
---|---|
-a或&& | 逻辑与,“而且”的意思 |
-o或‖ | 逻辑或,“或者”的意思 |
! | 逻辑否 |
((4>5))&& echo yes || echo no "4>5"成立时输出yes,不成立则显示no
no
((4<5))&& echo yes || echo no "4<5"成立时输出yes,不成立则显示no
yes
多个||间是或者的意思,成立一个即可。
[ 4 -lt 5 ] && echo yes || echo no "4<5"成立时,显示yes,||是或者的意思,成立一个即可
yes
[ 4 -gt 5 ] || echo yes && echo no "4>5"不成立,就会显示yes和no
yes
no
[ 4 -lt 5 ] || echo yes && echo no "4<5"成立时,显示no
no
vim ping.sh
#!/bin/bash
ping -c 3 -i 0.5 -W 2 $1 &> /dev/null && echo "$1 online" || echo "$1 off"
-c: 发送包的个数
-i:发送包的间隔时间
-W: 超时时间
-w: 多少秒后停止ping 命令操作
sh ping.sh 192.168.121.22 运行脚本文件ping开机的主机IP地址:192.168.121.22
sh ping.sh 192.168.121.88 运行脚本文件ping未开机的主机IP地址:192.168.121.88
二.if语句
1.单分支结构
if 条件测试操作 if 已用磁盘空间>7%
then 命令序列 then 磁盘空间不足
fi fi
zrg=`df | grep "dev/sda1" | awk ‘{print $2}’ `
sy=`df | grep "dev/sda1" | awk '{print $3}' `
USE=`awk "BEGIN {print $sy/$zrg*100}" | awk -F '.' '{print $1}'`
if [USE -ge 25]
>then
> echo "警告,磁盘空间不足!"
fi
2.双分支结构
if 条件测试操作 if 80端口是否在监听
then 命令序列1 then 网站服务已在运行
else 命令序列2 else 启动httpd服务
fi fi
vim http.sh
#!/bin/bash
netstat -natup |grep ":80" 查看当前系统中的80端口是否在监听
if [ $? -eq 0 ]
then
echo “网站服务已经在运行。”
else
echo“启动httpd服务”
yum -y install httpd > /dev/null 安装httpd服务
systemctl start httpd 启动httpd服务
fi
sh http.sh 运行脚本
3.多分支结构
if 条件测试操作1 if 分数为90~100之间
then 命令序列1 then 判为优秀
eilf 条件测试操作2 elif 分数在60~89之间
then 命令序列2 then 判为合格
else else
命令序列3 判为不合格
fi fi
vim chj.sh
#!/bin/bash
read -p "输入你的分数:" chj
if [ $chj -ge 90 ] && [ $chj -le 100]
then
echo "优秀"
elif [ $chj -ge 60 ] && [ $chj -lt 90]
then
echo "合格"
else
echo “不及格”
fi
sh shj.sh
三.case语句
case 变量值 in case 分数 in
模式1) 90~100)
命令序列1 判为优秀
;; ;;
模式2) 60-89)
命令序列2 判为合格
;; ;;
…… ……
*) *)
默认命令序列 判为不合格
esac esac
Vim chj2.sh
#!/bin/bash
read -p "请输入你的分数:" chenj
[[ $chenj -ge 90 && $chenj -le 100 ]] && a="A"
[[ $chenj -ge 60 && $chenj -lt 90 ]] && a="B"
[[ $chenj -ge 0 && $chenj -lt 60 ]] && a="C"
case $a in
A)
echo "$A分,优秀!"
;;
B)
echo "$B分,合格!"
;;
C)
echo "$C分,不合格!"
;;
*)
echo “输入有误!”
esac
以上是关于Shell脚本------条件语句(条件测试,if语句,case语句)的主要内容,如果未能解决你的问题,请参考以下文章