一.shell条件测试语句
1.1 test命令
数据如果判断为真,返回0,如果为假,为非0
- test [操作符选项] 表达式
- [ 操作符选项 表达式 ]
1.2 文件测试
文件测试常见选项
| 选项 | 作用 |
|---|---|
| -d | 测试指定对象是否为目录:指定的目录是否存在 |
| -e | 测试目录或文件是否存在 |
| -f | 测试指定对象是否为文件:制定的文件是否存在 |
| -r | 测试当前用户是否有权限读取(Read) |
| -w | 测试当前用户是否有权限写入(Write) |
| -x | 测试当前用户是否有权限执行(eXcute) |
| -L | 测试是否为符号链接(软链接文件) |
实例:
1.3 整数值测试
格式:
[ 整数1 操作符 整数2 ]
整数值比较常用操作符
| 文字操作符 | 符号操作符 | 含义 |
|---|---|---|
| -eq | 等于(Equal) | |
| -ne | 不等于(Not Equal) | |
| -lt | 小于(Leser Than) | |
| -gt | 大于(Greater Than) | |
| -le | 小于或等于(Lesser or Equal) | |
| -ge | 大于或等于(Greater or Equal) |
表达式可以用数字来表示,也可以用变量来表示对比
实例:
[root@localhost ~]# [ 10 -gt 20 ]
#10是否大于20
[root@localhost ~]# echo $?
1
#返回1,表示错误
[root@localhost ~]# a=10
[root@localhost ~]# b=20
#定义变量ab的变量值为数字
[root@localhost ~]# [ $a -lt $b ]
#$a的数值是否小于$b
[root@localhost ~]# echo $?
0
1.4 字符串比较
格式:
[ 字符串1 = 字符串2 ] #判断是否相等
[ 字符串1 != 字符串2 ] #判断是否不等
[ -z 字符串 ] #判断字符串内容是否为空
操作符
| 操作符 | 含义 |
|---|---|
| = | 字符串内容相同 |
| != | 字符串内容不同,!号表示相反的意思 |
| -z | 字符串内容为空 |
实例
判断当前系统语言环境是否为“us.en”,如果不是则提示
[root@localhost ~]#echo $LANG
zh_CN.UTF-8
[root@localhost ~]#test `echo $LANG`="us.en"&&echo \
#当前系统语言不是us.en,当前系统语言为`echo $LANG`
当前系统语言不是us.en,当前系统语言为zh_CN.UTF-8
[root@localhost ~]#
1.5 逻辑测试
格式:
[ 表达式1 ] 操作符 [ 表达式2 ]
命令1 操作符 命令2
操作符:
| -a或&& | and前后条件都要成立 |
|---|---|
| -o或▕▕ | or只需前后条件中一个成立 |
| ! | 逻辑否 |
多种表达方法
[ 表达式1 ] && [ 表达式2 ] 等同于 [ 表达式1 -a 表达式2 ] [[ 表达式1 && 表达式2 ]]
[ 表达式1 ] || [ 表达式2 ] 等同于 [ 表达式1 -o 表达式2 ] [[ 表达式1 || 表达式2 ]]
三元运算符
顾名思义,三元如名字表示的三元运算符需要三个操作数。
当条件表达式为真时,取a值;当条件表达式为假时,取b值
#表达方式如下
[ 表达式 ] && a || b
实例
[root@localhost ~]# cat ping.sh
#!/bin/bash
ping -c3 $1 &>/dev/null && echo "host online" || echo "host down"
[root@localhost ~]# ./ping.sh 192.168.159.100
host down
[root@localhost ~]# ./ping.sh 192.168.159.101
host online
二 if语句
2.1.1 单分支结构
if语句需要逐层盘点,执行相对较慢,在编写过程中,如果在if then语句结束后,没有其他默认值,可以省略else
格式
格式:
1. if [ 条件判断式 ]; than
2. 当条件判断成立时,执行一条或多条命令
3. fi
实例
[root@localhost ~]#if test -e data; then echo "文件存在"; fi
文件存在
[root@localhost ~]#
2.1.2 双分支结构
格式
if [ 条件判断式 ]; then
当条件判断成立时,可以执行一条或多条命令
else
当条件判断不成立时,可以执行一条或多条命令
fi
实例
测试httpd服务是否安装并开启脚本,如果没有,实现自动安装并开启(使用了if脚本嵌套)
#!/bin/bash
netstat -ntap | grep :80 &> /dev/null
#检测80端口是否开启,并将print信息导入黑洞中
if [ $? -eq 0 ]
#如果80端口返回0,也就是启动成功
then
#则
echo "网站服务正在运行"
#print 网站正在运行
else
#如果不是
#下面是在if语句中嵌套if语句
if rpm -q httpd &> /dev/null
#如果已经按安装httpd服务
then
#则输出httpd正在启动
echo "正在启动httpd服务"
systemctl start httpd
#执行httpd启动命令
else
#如果没有
echo "正在安装并启动httpd服务"
yum install -y httpd &> /dev/null && systemctl start httpd &> /dev/ null
#则安装httpd并且启动
fi
fi
2.1.3 多分支结构
格式
if [ 条件判断式 ]; then
当条件判断成立时,可以执行一条或多条命令
elif [ 条件判断式二 ]; then
当条件判断成立时,可以执行一条或多条命令
...(可以使用多次)
else
当上面的条件判断都不成立时,可以执行一条或多条命令
fi
实例
根据分数情况给评价
[root@localhost ~]# cat ifjisuanqi.sh
#!/bin/bash
read -p "请输入您的分数(1-100):" num
if [ $num -ge 85 ] && [ $num -le 100 ]
then
echo "$num分,优秀!!!"
elif [ $num -ge 70 ] && [ $num -le 84]
then
echo"$num分,合格!"
else
ehco"$num分,不合格"
fi
三 case语句
格式
格式:
case 变量名称 in
模式1)
命令序列
;;
模式2)
程序段
;;
*)
不包含第一个变量内容与第二个变量内容的其他程序执行段
默认程序段
;;
esac
注意点:
- case行首必须以单词“in”,每一模式必须以单个右括号")"结束
- 双分号";;"表示命令序列的结束
- 模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以使用竖杠|表示或,比如a|b
- 最后的*)表示默认模式,其中的*相当于通配符
实例
使用case语句配合正则表达式判断分数情况
#!/bin/bash
read -p "请输入您的分数(0-100)" num
case $num in
100)
echo "恭喜您,获得$num 分"
;;
[89][0-9])
echo "获得 $num 分,优秀"
;;
[67][0-9])
echo "继续努力,获得 $num 分"
;;
[0-9]|[1-5][0-9])
echo "成绩不佳,获得 $num 分"
;;
*)
echo "输入有误"
esac
~
习题
1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
方法1
[root@localhost ~]# [ -d ~/test.sh ] && echo "文件存在" ||echo "文件不存在"
文件不存在
[root@localhost ~]# [ -x ~/test.sh ] && echo "可执行" ||echo "不可执行"
不可执行
2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
#!/bin/bash
read -p "请输入时间成绩[0-10]:" pao
if [ $pao -gt 0 ] && [ $pao -le 10 ]
then
echo "成功晋级选拔赛"
read -p "请输入性别:" xb
if [ $xb = "男" ];
then
echo "男生组"
elif [ $xb = "女" ];
then
echo "女生组"
else
echo "输入错误"
fi
elif [ $pao -gt 10 ];
then
echo "淘汰"
else
echo "重新输入"
fi