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
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
示例:判断用户名与密码是否为空
示例:监控端磁盘使用空间
df | grep /dev/sr0 | awk '{print $5}' | awk -F % '{print $1
[root@localhost shell]# ./test02.sh 警告!当前/目录的磁盘使用率为100%
3.2、if双分支判断
if 条件测试 then 命令序列1 else 命令序列2 fi -------------------------- if 条件测试;then 命令序列1 else 命令序列2 fi
示例:测试主机是否ping通
示例2:查看端口
netstat ss
- -natp
- -natup
- -lntup
3.3、if多分支判断
语法:
if 条件测试1;then 命令序列1 elif 条件判断2;then 命令序列2 ....... else 命令序列n fi
示例:猜数字
示例2:查看端口
netstat ss
- -natp
- -natup
- -lntup
4、for循环
语法:
for 变量 in 值列表 do 命令序列 done ----------------------- for((初值;条件;步长)) do 命令序列 done ------------------------ for 变量 in { ... } do 命令序列 done
示例:循环创建10个系统账户
示例:99乘法表
5、while循环
语法:
while 条件测试 do 命令序列 done
6、case语句
- 检查、判断变量的取值
- 效果类似于多分支的if语句
- 命令序列最后必须以分号结尾
case 变量 in 模式1) 命令序列1;; 模式2) 命令序列2;; ..... *) 默认命令序列 esac
示例:
阅读剩余
版权声明:
作者:做个超努力的小奚&kervin24
个人博客站:http://www.kervin24.top
CSDN博客:https://blog.csdn.net/qq_52914969?type=blog
作者:做个超努力的小奚&kervin24
个人博客站:http://www.kervin24.top
CSDN博客:https://blog.csdn.net/qq_52914969?type=blog
THE END