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}



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值