个人博客站—运维鹿: 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 1500inet 192.168.96.105 netmask 255.255.255.0 broadcast 192.168.96.255inet6 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 0TX packets 4058 bytes 437276 (427.0 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[root@localhost /]# ifconfig ens33 | grep netmaskinet 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
示例: