目录
- 一.条件测试
- 1.test命令
- 2.整数值比较
- 3.字符串比较
- 4.逻辑测试
- 二.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" 用户数是否>&#61;3
free -m
Free1&#61;$(free -m | grep "Mem&#xff1a;" | awk &#39;{print $4}&#39;) 定义变量名Free1的变量值为以MB为单位显示内存情况&#xff0c;过滤出Mem行的内容&#xff0c;并且打印出第四列的内容
[ $Free1 -lt 1024 ]&& echo "当前空闲内存为${Free1}MB" 显示空闲内存是否小于1024MB&#xff0c;并且输出当前空闲内存的大小
浮点运算需要&#xff0c;要借助bc或awk处理
free -m 查看当前系统的内存使用情况&#xff0c;以MB为单位
Total1&#61;$(free -m | grep "Mem:" |awk &#39;{print $2}&#39;) 定义变量名Total1的变量值为以MB为单位显示内存情况&#xff0c;过滤出Mem行的内容&#xff0c;并且打印出第二列的内容
Free1&#61;$(free -m | grep "Mem&#xff1a;" |awk &#39;{print $4}&#39;) 定义变量名Free1的变量值为以MB为单位显示内存情况&#xff0c;过滤出Mem行的内容&#xff0c;并且打印出第四列的内容
free&#61;$(free -m | grep "Mem:" | awk &#39;{print $4/$2}&#39;)
echo $free 借助awk查看内存空闲率&#61;空闲内存\\总内存
echo “scale&#61;5&#xff1b;${Free1}/${Total1}” | bc 借助bc查看内存空闲率
3.字符串比较
格式一&#xff1a; [ 字符串1 &#61; 字符串2 ]
[ 字符串1 !&#61; 字符串2 ]
格式二&#xff1a;[ -z 字符串 ]
常用的测试操作符
测试操作符 | 含义 |
---|
&#61; | 字符串内容相同 |
!&#61; | 字符串内容不同&#xff0c;&#xff01;号表示相反的意思 |
-z | 字符串内容为空 |
echo $LANG
[ $LANG &#61; "zh_CN.UTF-8"]&& echo "Yes" 测试当前语言环境&#xff0c;是中文时显示yes
[ $LANG !&#61; "en.US"]&& echo "Yes" 测试当前语言环境&#xff0c;不是英文是时显示yes
4.逻辑测试
格式1&#xff1a; [ 表达式1 ] 操作符 [ 表达式2 ] ……
格式2&#xff1a;命令1 操作符 命令2 ……
常用的测试操作符
测试操作符 | 含义 |
---|
-a或&& | 逻辑与&#xff0c;“而且”的意思 |
-o或‖ | 逻辑或&#xff0c;“或者”的意思 |
&#xff01; | 逻辑否 |
((4>5))&& echo yes || echo no "4>5"成立时输出yes&#xff0c;不成立则显示no
no
((4<5))&& echo yes || echo no "4<5"成立时输出yes&#xff0c;不成立则显示no
yes
多个||间是或者的意思&#xff0c;成立一个即可。
[ 4 -lt 5 ] && echo yes || echo no "4<5"成立时&#xff0c;显示yes&#xff0c;||是或者的意思&#xff0c;成立一个即可
yes
[ 4 -gt 5 ] || echo yes && echo no "4>5"不成立&#xff0c;就会显示yes和no
yes
no
[ 4 -lt 5 ] || echo yes && echo no "4<5"成立时&#xff0c;显示no
no
vim ping.sh
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地址&#xff1a;192.168.121.22
sh ping.sh 192.168.121.88 运行脚本文件ping未开机的主机IP地址&#xff1a;192.168.121.88
二.if语句
1.单分支结构
if 条件测试操作 if 已用磁盘空间>7%
then 命令序列 then 磁盘空间不足
fi fi
zrg&#61;&#96;df | grep "dev/sda1" | awk ‘{print $2}’ &#96;
sy&#61;&#96;df | grep "dev/sda1" | awk &#39;{print $3}&#39; &#96;
USE&#61;&#96;awk "BEGIN {print $sy/$zrg*100}" | awk -F &#39;.&#39; &#39;{print $1}&#39;&#96;
if [USE -ge 25]
>then
> echo "警告&#xff0c;磁盘空间不足&#xff01;"
fi
2.双分支结构
if 条件测试操作 if 80端口是否在监听
then 命令序列1 then 网站服务已在运行
else 命令序列2 else 启动httpd服务
fi fi
vim http.sh
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
read -p "输入你的分数&#xff1a;" 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&#xff09; 90~100&#xff09;
命令序列1 判为优秀
&#xff1b;&#xff1b; &#xff1b;&#xff1b;
模式2&#xff09; 60-89&#xff09;
命令序列2 判为合格
&#xff1b;&#xff1b; &#xff1b;&#xff1b;
…… ……
*&#xff09; *&#xff09;
默认命令序列 判为不合格
esac esac
Vim chj2.sh
read -p "请输入你的分数&#xff1a;" chenj
[[ $chenj -ge 90 && $chenj -le 100 ]] && a&#61;"A"
[[ $chenj -ge 60 && $chenj -lt 90 ]] && a&#61;"B"
[[ $chenj -ge 0 && $chenj -lt 60 ]] && a&#61;"C"
case $a in
A&#xff09;
echo "$A分&#xff0c;优秀&#xff01;"
&#xff1b;&#xff1b;
B&#xff09;
echo "$B分&#xff0c;合格&#xff01;"
&#xff1b;&#xff1b;
C&#xff09;
echo "$C分&#xff0c;不合格&#xff01;"
&#xff1b;&#xff1b;
*&#xff09;
echo “输入有误&#xff01;”
esac