Shell编程-条件语句
一、条件测试:
1.test命令:
(1)用test:
选项 | 作用 |
---|---|
-d | 测试是否为目录 |
-f | 测试是否为普通文件 |
-e | 测试文件或目录是否存在 |
-a | 测试文件或目录是否存在, |
-L | 测试是否为软连接文件 |
-r | 判断当前用户是否有读权限,根据实际情况返回结果,不是按ll显示文件属性权限 |
-w | 判断当前用户是否有写权限,根据实际情况返回结果,不是按ll显示文件属性权限 |
-x | 判断当前用户是否有可执行权限,根据实际情况返回结果,root用户有时,其他账户也有;root用户没有时,其他账户也没有 |
[root@localhost ~]# test -d /etc #测试是否为目录
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -f /etc #测试是否为普通文件
[root@localhost ~]# echo $?
1
[root@localhost ~]# test -L /etc #测试是否为软连接文件
[root@localhost ~]# echo $?
1
[root@localhost ~]# test -e /etc # 测试文件或目录是否存在
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -a /etc 测试文件或目录是否存在
[root@localhost ~]# echo $?
0
(2)条件判断格式【 选项 参数 】:
[root@test1 ~]# [ -f 123.txt ] # 判断是否为普通文件
[root@test1 ~]# echo $?
1
[root@test1 ~]# [ -d /etc ] # 判断是否为目录文件
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ -e /etc ] # 判断是否为目录文件
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ -r /etc ] # 判断当前用户是否有读权限
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ -w /etc ] 判断当前用户是否有写权限
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ -x /etc ] #判断当前用户是否有执行权限
[root@test1 ~]# echo $?
0
2.正整数比较:
选项 | 作用 |
---|---|
-eq(==) | 比较第一个正整数是否等于(equal)第二个正整数 |
-ne(!=) | 比较第一个正整数不等于(not equal)第二个正整数 |
-gt(>) | 比较第一个正整数是否大于(Greate than)第二个正整数 |
-lt(<) | 比较第一个正整数是否小于(Lesser than)第二个正整数 |
-ge(>=) | 比较第一个正整数是否大于等于(Greate or equal )第二个正整数 |
-le)(<=) | 比较第一个正整数是否小于等于(Lesser or equal)第二个正整数 |
3.字符串比较:
选项 | 用途 |
---|---|
= | 等号前后字符串是否相等,注意前后需要空格 |
!= | !表示取反的意思,等号前后字符串是否不相等,注意前后需要空格。 |
-z | 判断字符串是否为空。 |
-n | 字符是否存在。 |
1.-z 判断字符串是否为空:
[root@test1 ~]# vim test.sh
#!/bin/bash
word=""
if [ -z "$word" ]
then
echo "空字符串"
else
echo "字符串不为空"
fi
[root@test1 ~]# sh test.sh
空字符串
2.-n 判断字符串是否存在:
[root@test1 ~]# vim test.sh
#!/bin/bash
word="bkpp"
if [ -n "$word" ]
then
echo "空字符串存在"
else
echo "字符串不存在"
fi
[root@test1 ~]# sh test.sh
空字符串存在
4.逻辑测试:
(1)操作符:
操作符 | 含义 | 符号 |
---|---|---|
且 | 前后两个条件都要成立 | -a,&& |
或 | 前后条件成立一个即可 | -o,|| |
否 | 不是 | ! |
(2)格式:
[ 表达式1 ] 操作符 [ 表达式2 ]
[[ 表达式1 ]] 操作符 [[ 表达式2 ]]
[root@test1 ~]# a=5
[root@test1 ~]# [ $a -ne 1 ] && [ $a != 2 ]
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ $a -ne 1 -a $a != 2 ]
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ $a -ne 1 ] || [ $a -le 3 ]
[root@test1 ~]# echo $?
0
二、if语句:
1.单分支结构:
[root@test1 ~]# vim if.sh
if [ 3 -gt 2 ]
then
echo "ok"
fi
[root@test1 ~]# sh if.sh
ok
2.双分支结构:
[root@test1 ~]# vim if.sh
if [ 3 -gt 4 ]
then
echo "ok"
else
echo "no ok"
fi
[root@test1 ~]# sh if.sh
no ok
(2)测试:
1.要求ping一个指定的IP地址,IP地址随机,如果ping通告诉主机在线,如果ping不通,告诉主机不在线。
[root@test1 ~]# vim if.sh
ping -c 3 -W 2 $1
if [ $? -eq 0 ]
then
echo "$1 online"
else
echo "$1 offline"
fi
[root@test1 ~]# sh if.sh 192.168.174.12
PING 192.168.174.12 (192.168.174.12) 56(84) bytes of data.
64 bytes from 192.168.174.12: icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from 192.168.174.12: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 192.168.174.12: icmp_seq=3 ttl=64 time=0.034 ms
--- 192.168.174.12 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.034/0.044/0.059/0.012 ms
192.168.174.12 online
或者:
[root@test1 ~]# sh if.sh 192.168.174.13
PING 192.168.174.13 (192.168.174.13) 56(84) bytes of data.
From 192.168.174.12 icmp_seq=1 Destination Host Unreachable
From 192.168.174.12 icmp_seq=2 Destination Host Unreachable
From 192.168.174.12 icmp_seq=3 Destination Host Unreachable
--- 192.168.174.13 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2000ms
pipe 3
192.168.174.13 offline
2.在1的基础上,不显示ping的过程,直接显示结果。
[root@test1 ~]# vim if.sh
ip=$(ping -c 3 -W 2 $1)
if [ $? -eq 0 ]
then
echo "$1 online"
else
echo "$1 offline"
fi
[root@test1 ~]# sh if.sh 192.168.174.12
192.168.174.12 online
[root@test1 ~]# sh if.sh 192.168.174.13
192.168.174.13 offline
3.判断奇数和偶数,一个方法解决,数字自定义输入:
[root@test1 ~]# vim if1.sh
read -p "请输入一个数字:" num
let i=$num%2
if [ $i -eq 0 ]
then
echo "偶数"
else
echo "奇数"
fi
[root@test1 ~]# sh if1.sh
请输入一个数字:2
偶数
[root@test1 ~]# vim if1.sh
[root@test1 ~]# sh if1.sh
请输入一个数字:7
奇数
3.多分支结构:
1.(1)判断分数,90-100为优秀,70-89为一般,60-69为加油,0-59 30遍。
[root@test1 ~]# vim if1.sh
read -p "请输入你的成绩:" score
if [ $score -ge 90 ] && [ $score -le 100 ]
then
echo "优秀"
elif [ $score -ge 70 ] && [ $score -le 89 ]
then
echo "一般"
elif [[ $score -ge 60 && $score -le 69 ]]
then
echo "加油"
else
echo "30遍"
fi
[root@test1 ~]# sh if1.sh
请输入你的成绩:99
优秀
[root@test1 ~]# sh if1.sh
请输入你的成绩:88
一般
[root@test1 ~]# sh if1.sh
请输入你的成绩:61
加油
[root@test1 ~]# sh if1.sh
请输入你的成绩:12
30遍
1.(2)过滤掉非法输入,非整数,要有提示,输入错误,并且不执行。(用嵌套)
[root@test1 ~]# vim if1.sh
read -p "请输入你的成绩:" score
if [ $score -ge $score ]
then
echo "输入正确"
if [ $score -ge 90 ] && [ $score -le 100 ]
then
echo "优秀"
elif [ $score -ge 70 ] && [ $score -le 89 ]
then
echo "一般"
elif [[ $score -ge 60 && $score -le 69 ]]
then
echo "加油"
else
echo "30遍"
fi
else
echo "输错了"
fi
[root@test1 ~]# sh if1.sh
请输入你的成绩:12
输入正确
30遍
[root@test1 ~]# sh if1.sh
请输入你的成绩:9.4
if1.sh: 第 2 行:[: 9.4: 期待整数表达式
输错了
2.检查用户家目录中的test.sh文件是否存在,并检查是否有执行权限。
[root@test1 ~]# vim if1.sh
if [ -e ~/test.sh ]
then
echo "存在"
else
echo "不存在"
fi
if [ -x test.sh ]
then
echo "有权限"
else
echo "无权限"
fi
[root@test1 ~]# sh if.sh
存在
无权限
4.case多分支语句:
(1)格式:
(2)逻辑:
(3)实操:
[root@test1 ~]# vim if1.sh
#90-100
#70-89
#60-69
read -p "请输入你的成绩:" num
[[ $num -ge 90 && $num -le 100 ]] && a="great"
[[ $num -ge 70 && $num -le 89 ]] && a="standard"
[[ $num -ge 60 && $num -le 69 ]] && a="bad"
case $a in
great)
echo "${num}分。优秀"
;;
standard)
echo "${num}分,一般"
;;
bad)
echo "${num}分,加油"
;;
*)
echo "30遍"
esac
[root@test1 ~]# sh if1.sh
请输入你的成绩:94
94分。优秀
[root@test1 ~]# sh if1.sh
请输入你的成绩:88
88分,一般
[root@test1 ~]# sh if1.sh
请输入你的成绩:68
68分,加油
[root@test1 ~]# sh if1.sh
请输入你的成绩:21
30遍
三、应用:
1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限。
[root@test1 ~]# vim if1.sh
if [ -e ~/test.sh ]
then
echo "存在"
else
echo "不存在"
fi
if [ -x test.sh ]
then
echo "有权限"
else
echo "无权限"
fi
[root@test1 ~]# sh if.sh
存在
无权限
2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误。
[root@test1 ~]# vim if.sh
read -p "请输入100M赛跑成绩的秒数:" num
if [[ $num -gt 0 && $num -le 10 ]]
then
echo "进入选拔赛"
read -p "请输入你的性别:" sex
if [ $sex == 男 ]
then
echo "进入男生组"
elif [ $sex == 女 ]
then
echo "进入女生组"
else
echo "提示错误"
fi
elif [ $num -gt 10 ]
then
echo "淘汰"
else
echo "重新输入"
fi
[root@test1 ~]# sh if.sh
请输入100M赛跑成绩的秒数:4
进入选拔赛
请输入你的性别:男
进入男生组
[root@test1 ~]# sh if.sh
请输入100M赛跑成绩的秒数:7
进入选拔赛
请输入你的性别:女
进入女生组
[root@test1 ~]# sh if.sh
请输入100M赛跑成绩的秒数:12
淘汰
[root@test1 ~]# sh if.sh
请输入100M赛跑成绩的秒数:q
if.sh: 第 16 行:[: q: 期待整数表达式
重新输入
3.用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录:
(1) 现在opt目录下打包两个以.tar.gz和.tar.bz2格式的包:
(2) 配置:
(3) 验证:
4.用case语句在/etc/init.d/目录中写一个firewalld脚本,并加入到系统服务管理中使能够使用 service firewalldstart|stop|restart|status 来管理firewalld服务,要求如果命令选项不对,则提示 “用法: $0 {start|stop|status|restart}”。
[root@test1 init.d]# vim firewalld.sh
read -p "请输入命令:" service
[[ $service == *start ]] && service=*start
[[ $service == *stop ]] && service=*stop
[[ $service == *restart ]] && service=*restart
[[ $service == *status ]] && service=*status
case $service in
*start)
systemctl start firewalld
echo "打开防火墙"
;;
*stop)
systemctl stop firewalld
echo "关闭防火墙"
;;
*restart)
systemctl restart firewalld
echo "重启防火墙"
;;
*status)
systemctl status firewalld
echo "查看防火墙状态"
;;
*)
echo "$0 {start|stop|status|restart}"
esac
[root@test1 init.d]# sh firewalld.sh
请输入命令:start
打开防火墙
[root@test1 init.d]# sh firewalld.sh
请输入命令:status
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 五 2023-05-26 16:03:53 CST; 10s ago
Docs: man:firewalld(1)
Main PID: 61299 (firewalld)
CGroup: /system.slice/firewalld.service
└─61299 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
5月 26 16:03:54 test1 firewalld[61299]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w ...?).
5月 26 16:03:54 test1 firewalld[61299]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w ...?).
5月 26 16:03:54 test1 firewalld[61299]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w ...?).
5月 26 16:03:54 test1 firewalld[61299]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w ...me.
5月 26 16:03:54 test1 firewalld[61299]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w ...me.
5月 26 16:03:54 test1 firewalld[61299]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w ...?).
5月 26 16:03:54 test1 firewalld[61299]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w ...?).
5月 26 16:03:54 test1 firewalld[61299]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w ...?).
5月 26 16:03:54 test1 firewalld[61299]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w ...?).
5月 26 16:03:54 test1 firewalld[61299]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w ...?).
Hint: Some lines were ellipsized, use -l to show in full.
查看防火墙状态
[root@test1 init.d]# sh firewalld.sh
请输入命令:reb
firewalld.sh {start|stop|status|restart}