条件测试语句
文件测试
文件测试格式:
格式一: test 操作符 表达式
格式二: [ 操作符 表达式 ]
复制代码
常用的文件测试操作符:
| 操作符 | 作用 |
|---|---|
| -d | 测试文件是否为目录文件(Directory) |
| -f | 测试文件是否为普通文件(File) |
| -e | 测试目录或文件是否存在(Exist) |
| -r | 测试当前用户是否有权限读取(Read) |
| -w | 测试当前用户是否有权限写入(Write) |
| -x | 测试当前用户是否有权限执行(eXcute) |
| -L | 测试是否为符号链接(软链接文件) |
示例1
[root@localhost ~]# test -d /etc/ //测试是否为目录
[root@localhost ~]# echo $? //状态码返回0,表示为真,是目录
0
[root@localhost ~]# test -f /etc/sysconfig/ //测试是否为普通文件
[root@localhost ~]# echo $? //状态码返回1,表示为假,不是普通文件
1
示例2
[root@localhost ~]# [ -e /etc/shadow ] //测试文件是否存在
[root@localhost ~]# echo $?
0
示例3
[root@localhost ~]# [ -r /etc/shadow ] //测试root用户对文件是否拥有读取权限
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -w /etc/shadow ] //测试root用户对文件是否拥有写入权限
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -x /etc/shadow ] //测试root用户对文件是否拥有执行权限
[root@localhost ~]# echo $?
1
整数测试
整数值比较:
[ 整数变量1 操作符 整数变量2 ]
test 整数变量1 操作符 整数变量2
复制代码
操作符:
| 操作符 | 含义 |
|---|---|
| -eq | 等于(Equal) |
| -ne | 不等于(Not Equal) |
| -gt | 大于(Greater Than) |
| -lt | 小于(Lesser Than) |
| -le | 小于或等于(Lesser or Equal) |
| -ge | 大于或等于(Greater or Equal) |
示例
[root@localhost ~]# [ 2 -lt 3 ]
[root@localhost ~]# echo $?
0
**## 字符串测试
常用的测试操作符
- =:字符串内容相同
- !=:字符串内容不同,! 号表示相反的意思
- -z:字符串内容为空
- -n:字符是否存在
字符串比较,常用的四种格式:
[ "字符串1" = "字符串2" ] //测试字符串1和字符串2的内容是否相同
[ "字符串1" != "字符串2” ] //测试字符串1和字符串2的内容是否不同
[ -z "字符串" ] //测试字符串是否为空,或者指定的变量是否为空值。(测试字符串的长度是否为零)
[ -n "字符串" ] //测试字符串是否存在,即是否不为空。(测试字符串的长度是否非零)
示例
[root@localhost ~]# [ $a = $b ];echo $? //测试变量a和变量b的值是否相同
1
[root@localhost ~]# [ $USER = root ];echo $? //测试当前用户是否为root
0
逻辑测试(短路运算)
逻辑测试用于连接多个测试条件,并返回整个表达式的值。 逻辑测试主要有"逻辑与","逻辑或","逻辑否"三种。
逻辑测试两种格式:
格式一:[ 表达式1 ] 逻辑运算符 [ 表达式2 ] ...
#例:[表达式1] && [表达式2] 等同于 [表达式1 -a 表达式2] 等同于 [[表达式1 && 表达式2]]
#例:[表达式1] || [表达式2] 等同于 [表达式1 -o 表达式2] 等同于 [[表达式1 || 表达式2]]
格式二:命令1 逻辑运算符 命令2 ...
复制代码
逻辑运算符:
- -a或&& :逻辑与,“而且”的意思,全真才为真。
- -o或|| :逻辑或,“或者”的意思,一真即为真。
- ! :逻辑否。
二元运算符
示例1:
[root@localhost ~]# [ 1 -lt 2 ] && [ 3 -eq 4 ] //测试1是否小于2,同时3是否等于4
[root@localhost ~]# echo $? //结果为假
1
[root@localhost ~]# [ 1 -lt 2 ] || [ 3 -eq 4 ] //测试1是否小于2,或者3是否等于4
[root@localhost ~]# echo $? //结果为真
0
示例2:
[表达式1] && [表达式2] 等同于 [表达式1 -a 表达式2] 等同于 [[表达式1 && 表达式2]]
[root@localhost ~]# a=5
[root@localhost ~]# [ $a -ne 1 ]&&[ $a != 2 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ $a -ne 1 -a $a != 2 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ $a -ne 1 && $a != 2 ]]
[root@localhost ~]# echo $?
0
三元运算符
[ 表达式 ] && a //相当于 if语句单分支结构
[ 表达式 ] && a || b //相当于 if语句双分支结构
[ 表达式 ] || b //相当于 if [表达式];else
示例
[root@localhost ~]# vim 555.sh //使用三元运算符写脚本
#!/bin/bash ping -c 3 -i 0.5 -w 3 $1 &>/dev/null && echo "$1 is up" || echo "$1 is down"
[root@localhost ~]# bash 555.sh 192.168.1.10 //执行脚本测试主机是否在线
192.168.1.10 is up
[root@localhost ~]# bash 555.sh 192.168.1.100
192.168.1.100 is down
if 语句
if 单分支结构
单分支语句格式:
if 判断条件
then 条件成立的分支代码
fi //条件不成立直接结束
示例
判断已用磁盘空间是否大于80%,如果是就报警提示。
[root@localhost ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17811456 3692028 14119428 21% /
devtmpfs 917604 0 917604 0% /dev
tmpfs 933524 0 933524 0% /dev/shm
tmpfs 933524 9240 924284 1% /run
tmpfs 933524 0 933524 0% /sys/fs/cgroup
/dev/sda1 1038336 182376 855960 18% /boot
tmpfs 186708 12 186696 1% /run/user/42
tmpfs 186708 0 186708 0% /run/user/0
[root@localhost ~]# df |grep /dev/sda1
/dev/sda1 1038336 182376 855960 18% /boot
[root@localhost ~]# df |grep /dev/sda1 |awk '{print $5}'
18%
[root@localhost ~]# df |grep /dev/sda1 |awk '{print $5}' |awk -F % '{print $1}'
18
[root@localhost ~]# vim 666.sh
#!/bin/bash
a=$(df |grep /dev/sda1 |awk '{print $5}' |awk -F % '{print $1}')
if [ $a -gt 10 ]
then
echo "内存不足"
fi
[root@localhost ~]# bash 666.sh
内存不足
if 双分支结构
双分支语句格式:
if 判断条件
then
条件成立的分支代码
else
条件不成立的分支代码
fi
示例
检测80端口是否在监听,如果是,则提示”网站服务已在运行“;如果否,则启动httpd服务。
[root@localhost ~]# vim 777.sh
#!/bin/bash
ss -ntap |grep :80 &>/dev/null
if [ $? -eq 0 ]
then
echo "http服务正在运行"
else
echo "http服务未运行"
fi
[root@localhost ~]# bash 777.sh
http服务未运行
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# bash 777.sh
http服务正在运行
if 多分支结构
多分支语句格式:
if 判断条件1
then
条件1为真的分支代码
elif 判断条件2
then
条件2为真的分支代码
elif 判断条件3
then
条件3为真的分支代码
...
else
以上条件都为假的分支代码
fi
示例
提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
[root@localhost ~]# vim demo1.sh
#!/bin/bash
#百米成绩
read -p "请输入100米赛跑的秒数:" time
if [ $time -gt 0 ] && [ $time -lt 10 ]
then
echo "进入选拔赛"
#判断男女性别
read -p "请输入性别(b(男)/g(女)):" sex
if [ $sex = b ]
then
echo "进入男生组"
elif [ $sex = g ]
then
echo "进入女生组"
else
echo "错误"
fi
elif [ $time -gt 10 ]
then
echo "淘汰"
else
echo "请重新输入"
[root@localhost ~]# bash demo1.sh
请输入100米赛跑的秒数:5
进入选拔赛
请输入性别(b(男)/g(女)):b
进入男生组
case语句
格式:
case 变量引用 in
模式1)
命令分支1
;;
模式2)
命令分支2
;;
...
*)
默认命令分支
esac
示例
提示用户输入分数(0-100),判断分数范围,分出优秀、良好、及格、不及格四档。如果用户输入的分数值不在0-100之间,则提示重新输入。
[root@localhost ~]# vim 888.sh
#!/bin/bash
read -p "请输入你的分数(0-100):" a
case $a in
100)
echo "优秀"
;;
[89][0-9])
echo "良好"
;;
[67][0-9])
echo "及格"
;;
[0-9]|[1-5][0-9])
echo "不及格"
;;
*)
echo "输入有误,请重新输入,范围0-100"
esac
[root@localhost ~]# bash 888.sh
请输入你的分数(0-100):0
不及格
[root@localhost ~]# bash 888.sh
请输入你的分数(0-100):20
不及格
[root@localhost ~]# bash 888.sh
请输入你的分数(0-100):60
及格
[root@localhost ~]# bash 888.sh
请输入你的分数(0-100):90
良好
[root@localhost ~]# bash 888.sh
请输入你的分数(0-100):100
优秀
[root@localhost ~]# bash 888.sh
请输入你的分数(0-100):110
输入有误,请重新输入,范围0-100