一.条件测试操作
1.test命令
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0(真true)时表示成功,返回值为非0值(假false)时表示失败或异常。
test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立($?返回值为 0 表示条件成立)。
格式1:test 条件表达式
格式2:[ 条件表达式 ] 方括号“[”或“]”与条件表达式之间要有空格
[root@localhost ~]# test a = b
[root@localhost ~]# echo $?
1
[root@localhost ~]# test a = a
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 1 = 1
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 1 = 2
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ 1 = 1 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ 1 = 2 ]
[root@localhost ~]# echo $?
1
2.文件测试
格式 [ 操作符 文件或目录 ]
常用的操作符号
-e:测试目录或文件是否存在(Exist)。
-d:测试是否为目录(Directory)。
-f:测试是否为文件(File)。
-r:测试当前用户是否有权限读取(Read)。
-w:测试当前用户是否有权限写入(Write)。
-x:测试是否设置有可执行(Excute)权限。
-L:测试是否为符号链接文件(软链接文件)
[root@localhost opt]# mkdir test
[root@localhost opt]# touch test{1..3}.sh
[root@localhost opt]# ls
test test1.sh test2.sh test3.sh
[root@localhost opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 5月 8 10:24 test
-rw-r--r--. 1 root root 0 5月 8 10:24 test1.sh
-rw-r--r--. 1 root root 0 5月 8 10:24 test2.sh
-rw-r--r--. 1 root root 0 5月 8 10:24 test3.sh
[root@localhost opt]# test -e test
[root@localhost opt]# echo $?
0
[root@localhost opt]# test -e test4
[root@localhost opt]# echo $?
1
[root@localhost opt]# test -e test3.sh
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ -d test ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ -d test1.sh ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ -x test1.sh ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ -x test ]
[root@localhost opt]# echo $?
0
2.1整数值测试
格式 [ 整数变量1 操作符 整数变量2 ]
常用的操作符号
-eq:等于 ==
-ne:不等于 !=
-gt:大于 \>
-lt:小于 \<
-le:小于等于
-ge:大于等于
[root@localhost opt]# test 100 -eq 100
[root@localhost opt]# echo $?
0
[root@localhost opt]# test 100 -eq 200
[root@localhost opt]# echo $?
1
[root@localhost opt]# test 100 -ne 200
[root@localhost opt]# echo $?
0
[root@localhost opt]# test 100 -le 200
[root@localhost opt]# echo $?
0
[root@localhost opt]# test 100 -ge 200
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ 100 -ge 100 ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [[ 99+1 -eq 100 ]]
[root@localhost opt]# echo $?
0
[root@localhost opt]# echo $((99+1))
100
[root@localhost opt]# ((99+1 == 100))
[root@localhost opt]# echo $?
0
2.2字符串测试
格式1
[ 字符串1 = 字符串2 ] 或 [[ 字符串1 == 字符串2 ]] #相同
[ 字符串1 != 字符串2 ] 或 [[ 字符串1 != 字符串2 ]] #不相同
[[ 字符串1 =~ 字符串2 ]] #包含
[root@localhost opt]# [ 100 == 100 ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ 100 == 200 ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ 100 != 200 ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ 100 != 100 ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [[ "abc" =~ "a" ]]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [[ "abc" =~ "1" ]]
[root@localhost opt]# echo $?
1
格式2:
[ -z "字符串" ] #检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串
[ -n "字符串" ] #检查是否有字符串存在
请注意:引号的使用,这是防止空格扰乱代码的好方法
[root@localhost opt]# a=abc
[root@localhost opt]# echo $a
abc
[root@localhost opt]# [ -z $a ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ -z $b ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ -n $a ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ -n $b ]
[root@localhost opt]# echo $?
0
请注意:引号的使用,这是防止空格扰乱代码的好方法
[root@localhost opt]# [ -n "$b" ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ -n "$a" ]
[root@localhost opt]# echo $?
0
3.逻辑测试
格式1 [ 表达式1 ] 操作符 [ 表达式2 ]...
格式2 命令1 操作符 命令2 ...
常用的测试操作符
-a或&& 逻辑与,“而且”的意思,前后条件需都成立
-o或|| 逻辑或,“或者”的意思,只需前后条件中一个成立
! 逻辑否,取反
[root@localhost opt]# a=100
[root@localhost opt]# [ $a -gt 99 ] && [ $a -eq 100 ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ $a -gt 99 ] && [ $a -ne 100 ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ $a -gt 99 ] || [ $a -ne 100 ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ $a -gt 999 ] || [ $a -ne 100 ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ $a -gt 999 ] || [ $a -eq 100 ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ $a -gt 99 -a $a -ne 100 ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ $a -gt 99 -a $a -eq 100 ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ $a -gt 99 -o $a -eq 100 ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ $a -gt 99 -o $a -ne 100 ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [[ $a -gt 99 && $a -ne 100 ]]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [[ $a -gt 99 || $a -ne 100 ]]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ 100 -gt 99 ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ ! 100 -gt 99 ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ 100 -lt 99 ]
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ ! 100 -lt 99 ]
[root@localhost opt]# echo $?
0
拓展: 三元表达式
格式: 条件表达式?值1;:值2
当条件表达式成立则取值1,条件表达式不成立则取值2
[ 条件表达式 ] || 命令1 #如果表达式1条件成立,不会执行或运算符后面的命令1,
#如果条件不成立,则会执行或运算符后面的命令1。
[ 条件表达式 ] && 命令1 || 命令2 #如果表达式1条件成立则执行命令1
#如果表达式1条件步成立则执行命令2
[root@localhost opt]# echo $a 100 [root@localhost opt]# [ $a -gt 99 ] && echo ture || echo false ture [root@localhost opt]# [ $a -gt 200 ] && echo ture || echo false false
[ ! 表达式1 ] #取反,如果表达式1条件成立则最终结果为条件不成立
案例实操
[root@localhost ~]# ping -c 4 -i 0.5 -w 2 192.168.10.20
PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data.
--- 192.168.10.20 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 1999ms
[root@localhost ~]# echo $?
1
[root@localhost ~]# ping -c 4 -i 0.5 -w 2 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.015 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.087 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.071 ms
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 1499ms
rtt min/avg/max/mdev = 0.015/0.060/0.087/0.028 ms
[root@localhost ~]# echo $?
0
[root@localhost ~]# ping -c 4 -i 0.5 -w 2 192.168.10.10 &> /dev/null
[root@localhost ~]# echo $?
0
[root@localhost ~]# ping -c 4 -i 0.5 -w 2 192.168.10.10 &> /dev/null && echo "it is online" || echo "it is offline"
it is online
[root@localhost ~]# ping -c 4 -i 0.5 -w 2 192.168.10.20 &> /dev/null && echo "it is online" || echo "it is offline"
it is offline
[root@localhost ~]# vim ping.sh
#!/bin/bash
IP=$1
ping -c 4 -i 0.5 -w 2 $IP &> /dev/null && echo "$IP is online" || echo "$IP is offline"
保存退出
[root@localhost ~]# chmod +x ping.sh
[root@localhost ~]# ./ping.sh 192.168.10.10
192.168.10.10 is online
[root@localhost ~]# ./ping.sh 192.168.10.20
192.168.10.20 is offline
ss -lntp | grep :80 &> /dev/null && echo 'httpd is starting' || systemctl start httpd
查看服务是否开启,如果已经开启,就输出 httpd is starting ,如果没开启就开启服务
拓展:判断进程是否正在运行的方法:
systemctl status 进程服务
netstat -lntup | grep :端口/进程名
ss -lntup | grep :端口/进程名
lsof -i :端口
ps -elf | grep 进程名 | grep -v "grep" | grep -v "$$" | wc -l
pidof 进程名 | wc -w
killall -0 进程名
二.IF语句
if 语句的结构
(1)单分支结构
if 条件测试操作 if 已用磁盘空间>80%
then 命令序列 then 报警
fi fi
[root@localhost ~]# df | grep -w / | awk '{print $2}'
37202180
[root@localhost ~]# df | grep -w / | awk '{print $3}'
4670120
[root@localhost ~]# total=$(df | grep -w / | awk '{print $2}')
[root@localhost ~]# used=$(df | grep -w / | awk '{print $3}')
[root@localhost ~]# echo $total
37202180
[root@localhost ~]# echo $used
4670044
[root@localhost ~]# echo "scale=2; ${used}/${total}*100" | bc
12.00
[root@localhost ~]# echo "scale=2; ${used}/${total}*100" | bc | awk -F. '{print $1}'
12
查看磁盘使用率的脚本,如过超过10%就警告
[root@localhost demo]# vim demo1.sh
#!/bin/bash
#总磁盘大小
total=$(df | grep -w / | awk '{print $2}')
#已经使用的磁盘大小
used=$(df | grep -w / | awk '{print $3}')
#磁盘使用率的百分比
precent=$(echo "scale=2;${used} / ${total}*100" | bc | awk -F. '{print $1}')
if [ $precent -gt 10 ]
then
echo "警告!当前磁盘使用已超过10%!使用率为 ${precent}%"
fi
[root@localhost demo]# ./demo1.sh
警告!当前磁盘使用已超过10%!使用率为 12%
(2)双分支结构
if 条件测试操作 if 80端口是否在监听
then 命令序列1 then 网站服务已已在允许
else 命令序列2 else 启动httpd服务
fi fi
[root@localhost demo]# vim demo2.sh
#!/bin/bash
netstat -lntp | grep :80 &>/etc/null
if [ $? -eq 0 ]
then
echo "网站服务已在运行" #双分支结构
else
echo "正在启动网站服务..."
systemctl start httpd
fi
"demo2.sh" [新] 11L, 185C 已写入
[root@localhost demo]# chmod +x demo2.sh
[root@localhost demo]# ./demo2.sh
网站服务已在运行
[root@localhost demo]# systemctl stop httpd
[root@localhost demo]# ./demo2.sh
正在启动网站服务...
[root@localhost demo]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2024-05-08 20:10:01 CST; 29s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 70088 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
Tasks: 6
CGroup: /system.slice/httpd.service
├─70088 /usr/sbin/httpd -DFOREGROUND
├─70089 /usr/sbin/httpd -DFOREGROUND
├─70090 /usr/sbin/httpd -DFOREGROUND
├─70091 /usr/sbin/httpd -DFOREGROUND
├─70092 /usr/sbin/httpd -DFOREGROUND
└─70093 /usr/sbin/httpd -DFOREGROUND
5月 08 20:10:01 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
5月 08 20:10:01 localhost.localdomain httpd[70088]: AH00558: httpd: Could not reliably dete...ge
5月 08 20:10:01 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
(3)多分支语句
if 条件测试操作1 fi 分数为85-100之间
then 命令序列1 then 判为优秀
elif 条件测试序列操作2 elfi 分数为70-84之间
then 命令序列2 then 判为合格
else else
命令序列3 判为不合格
fi fi
[root@localhost demo]# vim demo3.sh
#!/bin/bash
read -p "请输入你的分数:" score
if [ $score -ge 85 -a $score -le 100 ]
then echo "优秀"
elif [ $score -ge 70 -a $score -le 84 ]
then echo "合格"
else
echo "不合格"
fi
[root@localhost demo]# ./demo3.sh
请输入你的分数:74
合格
[root@localhost demo]# ./demo3.sh
请输入你的分数:69
不合格
[root@localhost demo]# ./demo3.sh
请输入你的分数:88
优秀
三.case 语句
case多分支结构
case 变量值 in case 分数 in
模式1) 85-100)
命令序列1 判为优秀
;; ;;
模式2) 70-84)
命令序列2 判为合格
;; ;;
*) *)
默认命令序列 判为不合格
esac easc
[root@localhost demo]# vim demo4.sh
#!/bin/bash
read -p "请输入你的成绩:" score
case $score in
100)
echo "恭喜!"
;;
9[0-9])
echo "加油!"
;;
[0-9]|[1-6][0-9])
echo "再接再厉!"
;;
*)
echo "输入有误!"
esac
[root@localhost demo]# ./demo4.sh
请输入你的成绩:99
加油!
[root@localhost demo]# ./demo4.sh
请输入你的成绩:100
恭喜!
[root@localhost demo]# ./demo4.sh
请输入你的成绩:69
再接再厉!
[root@localhost demo]# ./demo4.sh 0
请输入你的成绩:0
再接再厉!
[root@localhost demo]# ./demo4.sh 0
请输入你的成绩:1000
输入有误!