shell命令脚本(2)——条件语句

 

个人博客站—运维鹿: http://www.kervin24.top

CSDN博客—做个超努力的小奚: https://blog.csdn.net/qq_52914969?type=blog

 

1、条件测试(上)

1.1.1、字符串比较

基本语法:判断成功为0,不成功为1

  • 是否为空[ -z “字符串” ]
  • 是否有字符存在[ -n “字符串“ ]
  • 等于[ 字符串1==字符串2 ]
  • 不等于[ 字符串1!=字符串2 ]
 [root@localhost ~]# echo $TT       TT为空
 
 [root@localhost ~]# [ -z $TT ]     判断TT是否为空
 [root@localhost ~]# echo $?        为空,则返回0
 0
 [root@localhost ~]# TT="hellow"    TT不为空
 [root@localhost ~]# [ -z $TT ]     判断TT是否为空
 [root@localhost ~]# echo $?        不为空,返回非0
 1

1.1.2、整数值比较

[ 整数值1 操作符 整数值2 ]

操作符 含义
-eq 等于(equal)
-ne 不等于(not equal)
-ge 大于或等于(greater or equal)
-le 小于或等于(less or equal)
-gt 大于(greater than)
-lt 小于(less than)
 [root@localhost ~]# [ 3 -lt 8 ]    3<8
 [root@localhost ~]# echo $?  
 0                       
 [root@localhost ~]# [ 3 -gt 8 ]    3>8
 [root@localhost ~]# echo $?
 1
 [root@localhost ~]# who      几个用户在登录
 root     pts/0        2022-03-28 09:00 (192.168.96.1)
 root     pts/1        2022-03-28 16:17 (192.168.96.1)
 root     pts/2        2022-03-28 16:29 (192.168.96.1)
 root     pts/3        2022-03-28 16:29 (192.168.96.1)
 [root@localhost ~]# who | wc -l  
 4
 [root@localhost ~]# [ $(who | wc -l ) -ge 2 ]    登录用户>=2
 [root@localhost ~]# echo $?                      
 0                                                 正确

1.1.3、文件状态测试

[ 操作符 文件或目录]

操作符 含义
-e 判断对象是否存在(exist),若存在则结果为真
-d 判断对象是否是目录(directory),是则为真
-f 判断对象是否为一般文件(file),是则为真
-r 判断对象是否有可读(read)权限,是则为真
-w 判断对象是否有可写(write)权限,是则为真
-x 判读对象是否有可执行(excute)权限,是则为真
 [root@localhost ~]# [ -e /etc ]        判读文件存不存在
 [root@localhost ~]# echo $?
 0
 [root@localhost ~]# [ -e /et ]         /et不存在
 [root@localhost ~]# echo $?
 1 

2、条件测试(下)

2.1、控制操作符号

使用控制符组合多个命令

  • ; 顺序执行,有错也继续执行
  • && 与逻辑关系
  • || 或逻辑关系
 [ 表达式1 ]  && [ 表达式2 ]   等同于[ 表达式1 -a 表达式2  ]
 [ 表达式1 ]  || [ 表达式2 ]   等同于[ 表达式1 -o 表达式2  ]

2.2、逻辑测试

类似于三元运算符号 条件表达式?a:b

 [  表达式  ]   &&   a  ||  b       正确执行a,不正确执行b

示例:

 [root@localhost ~]# mkdir shell          创建文件夹
 [root@localhost ~]# cd /root/shell          
 [root@localhost shell]# vi test01.sh     创建脚本test01
 [root@localhost shell]# vim  test01.sh
 [root@localhost shell]# chmod +x test01.sh   给脚本test01加执行权限
 ---------------------------------------
 #!/bin/bash
 #   -c 3表示ping3次包,-i表示指定每个包发送频率,0.5秒发一个,-w 2表示2秒后停止ping操作
 ping -c 3 -i 0.5 -w 2 $1 &> /dev/null  &&  echo "$1 is online"  ||  echo "$1 is offline"
 ---------------------------------------
 [root@localhost shell]# ./test01.sh 192.168.96.105
 192.168.96.105 is online
 [root@localhost shell]# ./test01.sh 192.168.96.106
 192.168.96.106 is offline

1649384474189

2.3、监控脚本

  • tr -s 删除多余重复字符串
  • cut过滤数据 -d 指定以什么为分隔符,-f(n) 指定我们需要输出的列
  • awk -F '字段分隔符 ' ‘ {print $1} ’
 [root@localhost /]# echo  “a  b   c” | tr -s " "          删除多余空行
 “a b c”
 [root@localhost /]# echo "aaaaaaaaaa" | tr -s "a"         删除多余字母
 a
 --------------------------------------------------
 [root@localhost /]# head -1 /etc/passwd               
 root:x:0:0:root:/root:/bin/bash
 [root@localhost /]# cut  -d: -f1 /etc/passwd             以:为分隔符过滤/etc/passwd第一行
 root
 bin
 daemon
 ......
 ......

示例:

 [root@localhost /]# ifconfig ens33                         
 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
         inet 192.168.96.105  netmask 255.255.255.0  broadcast 192.168.96.255
         inet6 fe80::880:99c7:2c24:11f  prefixlen 64  scopeid 0x20<link>
         ether 00:0c:29:c8:d2:cc  txqueuelen 1000  (Ethernet)
         RX packets 20602  bytes 1409682 (1.3 MiB)
         RX errors 0  dropped 0  overruns 0  frame 0
         TX packets 4058  bytes 437276 (427.0 KiB)
         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
 [root@localhost /]# ifconfig ens33 | grep netmask
         inet 192.168.96.105  netmask 255.255.255.0  broadcast 192.168.96.255
 [root@localhost /]# ifconfig ens33 | grep netmask | tr -s " "
  inet 192.168.96.105 netmask 255.255.255.0 broadcast 192.168.96.255
 [root@localhost /]# ifconfig ens33 | grep netmask | tr -s " " | cut -d" " -f3
 192.168.96.105
 ---------------------------------------------------------------------------------------
                      打开ens33网卡信息| 过滤出含netmask列 | 删除多余空格 | 过滤出第三列

示例2:

 [root@localhost shell]# df
 文件系统                   1K-块    已用    可用 已用% 挂载点
 /dev/mapper/centos-root 10475520 3919364 6556156   38% /
 devtmpfs                  917600       0  917600    0% /dev
 tmpfs                     933524       0  933524    0% /dev/shm
 tmpfs                     933524   17492  916032    2% /run
 tmpfs                     933524       0  933524    0% /sys/fs/cgroup
 /dev/sda1                1038336  182392  855944   18% /boot
 tmpfs                     186708      24  186684    1% /run/user/0
 tmpfs                     186708       4  186704    1% /run/user/42
 /dev/sr0                 4414592 4414592       0  100% /run/media/root/CentOS 7 x86_64
 [root@localhost shell]# df | grep /dev/sr0
 /dev/sr0                 4414592 4414592       0  100% /run/media/root/CentOS 7 x86_64
 [root@localhost shell]# df | grep /dev/sr0 | awk '{print $5}'
 100%
 [root@localhost shell]# df | grep /dev/sr0 | awk '{print $5}' | awk -F % ' {print $1}'
 100

3、if语句

3.1、if单分支判断

语法:

 if  条件测试
     then 命令序列
 fi
 -------------------
 if 条件测试;then
    命令序列
 fi

示例:判断用户名与密码是否为空

1648561370084

示例:监控端磁盘使用空间

 df | grep /dev/sr0 | awk  '{print $5}' | awk -F %  '{print $1

1649385863113

 [root@localhost shell]# ./test02.sh 
  警告!当前/目录的磁盘使用率为100% 

3.2、if双分支判断

 if 条件测试
 then 
     命令序列1
 else
     命令序列2
 fi
 --------------------------
 if  条件测试;then
     命令序列1
 else
     命令序列2
 fi

示例:测试主机是否ping通

1648562325930

示例2:查看端口

netstat ss

  • -natp
  • -natup
  • -lntup

1649386968165

3.3、if多分支判断

语法:

 if 条件测试1;then
     命令序列1
 elif 条件判断2;then
     命令序列2
 .......
 else 
     命令序列n
 fi

示例:猜数字

1648563593130

示例2:查看端口

netstat ss

  • -natp
  • -natup
  • -lntup

1649386968165

4、for循环

语法:

 for 变量 in  值列表
 do 
    命令序列
 done
 -----------------------
 for((初值;条件;步长))
 do 
    命令序列
 done
 ------------------------
 for  变量 in { ... }
 do 
    命令序列
 done

示例:循环创建10个系统账户

1648565961047

示例:99乘法表

1648567231377

5、while循环

语法:

 while 条件测试
 do
   命令序列
 done

6、case语句

  • 检查、判断变量的取值
  • 效果类似于多分支的if语句
  • 命令序列最后必须以分号结尾
 case 变量 in
 模式1)
   命令序列1;;
 模式2)
   命令序列2;;
   .....
 *)
    默认命令序列
 esac

示例:

1649387866084

阅读剩余
THE END