目录
1、条件测试
条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成。
测试过程,实现评估布尔声明,以便用在条件性环境下进行执行
- 若真,则状态码变量 $? 返回0
- 若假,则状态码变量 $? 返回1
1.1文件测试
test 测试文件的表达式 是否成立
格式1:test [操作符选项] 条件表达式
格式2:[ [操作符] 条件表达式 ]
操作符 | 作用 |
---|---|
-d | 测试是否为目录 |
-e | 测试目录或文件是否存在 |
-f | 测试 指定的对象是否为文件;指定的文件是否存在 |
-L | 测试文件是否为符号链接(软链接文件) |
-r | 测试 当前用户是否有读权限 |
-w | 测试 当前用户是否有写权限 |
-x | 测试 当前用户是否有执行权限 |
属性测试 | 作用 |
-t fd | fd 文件描述符是否在某终端已经打开 |
-s FILE | 是否存在且非空 |
-N FILE | 文件自从上一次被读取之后是否被修改过 |
-O FILE | 当前有效用户是否为文件属主 |
-G FILE | 当前有效用户是否为文件属组 |
- test [操作符选项] 条件表达式
- [ [操作符] 条件表达式 ]
1.2整数数值比较
格式:[ 整数1 操作符 整数2 ] 公式
- -eq:等于(Equal)
- -ne:不等于(Not Equal)
- -gt:数大于(Greater Than)
- -lt:小于(Lesser Than)
- -le:小于或等于(Lesser or Equal)
- -ge:大于或等于(Greater or Equal)
1.3字符串比较
格式:[ "字符串1" 操作符 "字符串2" ]
[ -z "字符串" ] 是否为空
[ -n "字符串" ] 字符是否存在
常用的测试操作符
- =:字符串内容相同
- !=:字符串内容不同,! 号表示相反的意思
- -z:字符串内容为空
- -n: 字符是否存在
1.4逻辑测试(短路运算)
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
常见条件
- -a或&&:逻辑与,“而且”的意思全真才为真
- -o或||:逻辑或,“或者”的意思一真即为真
- !:逻辑否
[ 表达式1 ] && [ 表达式2 ] 等同于 [ 表达式1 -a 表达式2 ] 等同于 [[ 表达式1 && 表达式2 ]]
[ 表达式1 ] || [ 表达式2 ] 等同于 [ 表达式1 -o 表达式2 ] 等同于 [[ 表达式1 || 表达式2 ]]
三元运算符
[ 表达式 ] && a || b
当条件表达式为真时,取a值;当条件表达式为假时,取b值
2、if语句
2.1单分支
与[ 表达式 ] && 效果相同
if [ 表达式 ];then
...
fi
例:磁盘使用率高于一定数值报警
[root@localhost ~]# df //查询磁盘信息
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 10475520 4616528 5858992 45% /
devtmpfs 917588 0 917588 0% /dev
tmpfs 933512 0 933512 0% /dev/shm
tmpfs 933512 17472 916040 2% /run
tmpfs 933512 0 933512 0% /sys/fs/cgroup
/dev/sda1 1038336 182388 855948 18% /boot
tmpfs 186704 4 186700 1% /run/user/42
tmpfs 186704 32 186672 1% /run/user/0
/dev/sr0 4414592 4414592 0 100% /run/media/root/CentOS 7 x86_64
[root@localhost ~]# vim test.sh
#!/bin/ bash
#磁盘使用率高于一定数值报警
USED=$(df | grep /dev/sda1 | awk '{print $5}' | awk -F '%' '{print $1}')
if [ $USED -gt 5 ] ; then
echo "警告!当前/目录的磁盘使用率为:$USED%"
fi
[root@localhost ~]# bash test.sh
警告!当前/目录的磁盘使用率为:18%
2.2双分支
与[ 表达式 ] && a || b效果相同
if [ 表达式 ];then
...
else
...
fi
例
[root@localhost ~]# vim user.sh
#!/bin/bash
#判断是否为超级管理员
if [ "$USER" != "root" ]
then
echo "非管理员用户无权限操作"
else
echo "是管理员用户"
fi
[root@localhost ~]# bash user.sh
是管理员用户
2.3多分支语句
if [ 表达式 ];then
...
elif [ 表达式 ];then
...
elif [ 表达式 ];then
...
[else]
fi
[root@localhost ~]# vim grade.sh
#!/bin/bash
#考试分数在90-100为优秀,70-89为良好,60-69为合格,低于60为不合格
read -p "请输入你的考试分数:" grade
if [ $grade -ge 90 ] && [ $grade -le 100 ];then
echo "你的成绩为$grade"
echo "你的成绩为优秀"
elif [ $grade -ge 70 ] && [ $grade -le 89 ];then
echo "你的成绩为$grade"
echo "你的成绩为良好"
elif [ $grade -ge 60 ] && [ $grade -le 69 ];then
echo "你的成绩为$grade"
echo "你的成绩为合格"
else
echo "你的成绩为$grade"
echo "你的成绩不合格"
fi
[root@localhost ~]# bash grade.sh
请输入你的考试分数:66
你的成绩为66
你的成绩为合格
3、case语句
case支持glob风格的通配符:
- * 任意长度任意字符
- ? 任意单个字符
- [0-9] 指定范围内的任意单个字符
- | 或者,如: a|b
case 变量 in
模式1)
....
;;
模式2)
....
;;
*)
....
;;
esca
例题
[root@localhost ~]# vim shuru.sh
#!/bin/bash
#输入yes或no中任意一个或多个字母的大小写都能识别为yes或n0
read -p "请输入yes/no: " key
case $key in
[nN]|[nN][oO])
echo "你输入的是no"
;;
[Yy]|[Yy][eE][Ss])
echo "你输入的是yes"
;;
*)
echo "你输入错误不是yes/no"
;;
esac
[root@localhost ~]# bash shuru.sh
请输入yes/no: y
你输入的是yes
[root@localhost ~]# bash shuru.sh
请输入yes/no: no
你输入的是no
[root@localhost ~]# bash shuru.sh
请输入yes/no: ni
shuru.sh:行11: echo你输入错误不是yes/no: 没有那个文件或目录
[root@localhost ~]# bash shuru.sh
请输入yes/no: mm
你输入错误不是yes/no