Shell 编程之条件语句

一.条件测试操作

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
输入有误!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值