文章目录
前言
条件测试语句能够让Shell脚本根据实际工作灵活调整工作内容,例如判断系统的状态后执行指定的工作,或创建指定数量的用户,批量修改用户密码,这些都可以让Shell脚本通过条件测试语句完成。在简单的shell脚本程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程。
但是,单一的顺序结构使得脚本过于机械化,不够“智能”,难以处理更加灵活的系统任务。
一:条件测试
1.1:文件测试
1.1.1:test命令
test命令:测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值
命令基本格式
格式一:test 条件表达式
格式二:[ 条件表达式 ] ‘两端要有空格,此法更为常用’
1.1.2:文件测试
文件测试基本格式
[ 操作符 文件或目录 ] ‘注意两端空格’
&? 返回0表示条件成立,返回非零值表示条件不成立
&& 逻辑与,"而且"的意思
|| 逻辑或,"或者"的意思
[root@ shanan test]# ls
bbb.txt ccc
[root@ shanan test]# test -d ccc
[root@ shanan test]# echo $?
0
[root@ shanan test]# test -f ccc
[root@ shanan test]# echo $?
1
[root@ shanan test]# [ -d ccc ]
[root@ shanan test]# echo $?
0
[root@ shanan test]# [ -x ccc ]
[root@ shanan test]# echo $?
[test1@ shanan test]$ ll
总用量 0
-rw-r--r--. 1 root root 0 7月 17 11:52 bbb.txt
drwxr-xr-x. 2 root root 6 7月 17 11:47 ccc
[test1@ shanan test]$ [ -w ccc ]
[test1@ shanan test]$ echo $?
1
[test1@ shanan test]$ [ -r ccc ]
[test1@ shanan test]$ echo $?
0
[test1@ shanan test]$
[test1@ shanan test]$ [ -r ccc ] && echo "yes"
yes
[test1@ shanan test]$ [ -w ccc ] && echo "yes"
[test1@ shanan test]$ [ -w ccc ] || echo "yes"
yes
1.2:整数测试
整数值比较
命令基本格式
[ 整数1 操作符 整数2 ]
常用的测试操作符
[root@ shanan ~]# [ 5 -gt 3 ]&& echo "yes"
yes
[root@ shanan ~]# [ 5 -gt 3 ] && echo "yes"
yes
[root@ shanan ~]# [ 5 -gt 6 ] && echo "yes"
[root@ shanan ~]# [ 5 -le 3 ] && echo "yes"
[root@ shanan ~]# [ 5 -le 6 ] && echo "yes"
yes
[root@ shanan ~]# free -m
total used free shared buff/cache available
Mem: 1819 146 1479 9 193 1481
Swap: 2047 0 2047
[root@ shanan ~]# free -m | grep "Mem" | awk '{print $4}'
1479
[root@ shanan ~]# ddd=$(free -m | grep "Mem" | awk '{print $4}')
[root@ shanan ~]# echo $ddd
1479
[root@ shanan ~]# [ $(free -m | grep "Mem" | awk '{print $4}') -gt 100 ] && echo "yes"
yes
[root@ shanan ~]# [ $(free -m | grep "Mem" | awk '{print $4}') -gt 80 ] && echo "yes"
yes
[root@ shanan ~]#
1.3:字符串与逻辑测试
1.3.1:字符串比较
常用的格式
格式一:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式二:[ -z 字符串 ]
[root@ shanan ~]# [ $LANG != "en_US" ] && echo "yes"
yes
[root@ shanan ~]# [ $LANG = "en_US" ] && echo "yes"
[root@ shanan ~]# [ "男" = "男" ] && echo "yes"
yes
[root@ shanan ~]# [ "男" != "男" ] && echo "yes"
[root@ shanan ~]# [ "男" != "女" ] && echo "yes"
yes
[root@ shanan ~]# [ "男" = "女" ] && echo "yes"
[root@ shanan ~]# vim 33.sh
#!/bin/bash
read -p "是否创建/opt/share目录:(yes/no)" ack
[ $ack = yes ] && mkdir /opt/share
echo "创建成功"
[root@ shanan ~]# ./33.sh
是否创建/opt/share目录:(yes/no)yes
创建成功
[root@ shanan ~]# ls
33.sh rh share
[root@ shanan /]# vim 44.sh
[root@ shanan /]# sh 44.sh
创建成功
[root@ shanan /]# cat 44.sh
#!/bin/bash
[ -d /test/demo ]&& echo "已经存在" || mkdir /test/demo && echo "创建成功"
[root@ shanan /]# ls /test
bbb.txt ccc demo
1.3.2:逻辑测试
基本格式
格式一: [ 表达式1 ] 操作符 [ 表达式2 ] …
格式二: 命令1 操作符 命令2 …
1
2
3
[root@ shanan test]# [ -d /test/demo ] && echo "yes"
yes
[root@ shanan test]# [ ! -d /tes/demo ] && echo "yes"
[root@ shanan test]]# [ 1 -eq 1 ] && [ 2 -eq 2 ] && echo "yes"
yes
[root@ shanan test]# [ 1 -eq 1 -a 2 -eq 2 ] && echo "yes" '-a和-o也可使用在[]中,更加方便'
yes
1.3.3:一元运算符,二元运算符和三元运算符
一元运算符
带一元运算符的表达式遵循从右到左的结合性,常见的一元表达式:++一元表达式,–一元表达式
前缀自增运算符与前缀自减运算符
在一元表达式的前面添加运算符++或–后得到的表达式是一个一元表达式。操作数将被加1(++)或减1(–),表达式的值是经过加1、减1 以后的值。操作数必须是一个左值。
i=1;
i++: i=$i+1
i=i++:先赋值在运算
i=++i:先自加在赋值
i=–i:先自减在赋值
[root@ shanan test]# i=1
[root@ shanan test]#
[root@ shanan test]# echo $i
1
[root@ shanan test]# let i=++i
[root@ shanan test]# echo $i
2
[root@ shanan test]# let i+=2
[root@ shanan test]# echo $i
4
二元运算符
a + b = c
三元运算符
条件&&结果1 || 结果2
二:if语句
2.1:if单分支语句
单分支结构(基本格式)
if 条件测试操作
then 命令序列
fi
单分支结构(举例)
if 磁盘已用空间>80%
then 报警
fi
exit 1 异常退出
exit 0 正常退出
实操演示
#!/bin/bash
#read -p "请输入目录:" dir
dir=/test/one
if [ ! -d $dir ]
then
mkdir -p $dir
echo "$dir创建成功"
fi
[root@ shanan test]# sh eee.sh
/test/one创建成功
2.2:if双分支语句
双分支结构(基本格式)
if 条件测试操作
then 命令序列1
else 命令序列2
fi
双分支结构(举例)
if 80端口是否在监听
then 网站服务已在运行
else 启动httpd服务
fi
举例1:
[root@ shanan test]# vim eee.sh
#!/bin/bash
#read -p "请输入目录:" dir
dir=/test/one
if [ ! -d $dir ]
then
mkdir -p $dir
echo "$dir创建成功"
else
echo "$dir已存在"
fi
~
[root@ shanan test]# sh eee.sh
/test/one已存在
举例2:查看目标主机是否存活,显示检测结果
[root@ shanan ~]# vim ping3.sh
#!/bin/bash
read -p "请输入IP地址:" addr
ping -c 3 -i 0.2 -W 3 $addr &> /dev/null
if [ $? -eq 0 ]
then
echo "$addr is up"
else
echo "$addr is down"
fi
[root@ shanan ~]# sh ping3.sh
请输入IP地址:192.168.100.1
192.168.100.1 is up
[root@ shanan ~]# vim ping3.sh
[root@ shanan ~]# sh ping3.sh
请输入IP地址:192.168.100.9
192.168.100.9 is down
其中:
-c:发送三个包
-i: 发包间隔0.2秒
-W:等待时间3秒
2.3:if多分支语句
多分支结构(基本格式)
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
elif 条件测试操作3
…
// elif可无限累加子条件
else
命令序列3
多分支结构(举例)
if 分数为85~100之间
then 判为优秀
elif 分数为70~84之间
then 判为合格
else
判为不合格
fi
举例:判断分数范围,分数优秀,合格,不合格三挡
[root@ shanan ~]# vim kaoshi.sh
#!/bin/bash
read -p "请输入成绩:" score
if [ $score -lt 0 ] || [ $score -gt 100 ]
then
echo "输入有误"
exit 1;
elif [ $score -ge 85 ] && [ $score -le 100 ]
then
echo "成绩优秀"
elif [ $score -ge 70 ] && [ $score -le 84 ]
then
echo "成绩合格"
else
echo "成绩不合格"
fi
[root@ shanan ~]# sh kaoshi.sh
请输入成绩:90
成绩优秀
[root@ shanan ~]# sh kaoshi.sh
请输入成绩:70
成绩合格
[root@ shanan ~]# sh kaoshi.sh
请输入成绩:40
成绩不合格
[root@ shanan ~]# sh kaoshi.sh
请输入成绩:-50
输入有误
– 插入 –
三 . case语句
3.1 语句结构
case变量值in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
…
*)
默认命令序列
esac
3.2 小实验-石头剪刀布
#!/bin/bash
computer=$[$RANDOM%3+1] //定义变量电脑, 后者为随机数生成,范围1-3
read -p " 请问你出什么 石头1 剪刀2 布3 : " player //定义玩家
case "$computer$player" in //定义条件模板
[1][2]) //匹配模板
echo "你输了,电脑出的石头,你的剪刀"
;;
[1][3])
echo "你赢了,电脑出的石头,你出的布"
;;
[1][1])
echo "平局,你们都出的石头"
;;
[2][2])
echo "平局,你们都出的剪刀"
;;
[2][1])
echo "你赢了,电脑出的剪刀,你出的石头"
;;
[2][3])
echo "你输了,电脑出的剪刀,你出的布"
;;
[3][3])
echo "平局,你们都出的布"
;;
[3][1])
echo "你输了,电脑出的布,你出的石头"
;;
[3][2]) "你赢了,电脑出的布,你出的剪刀"
;;
*?) //上面没匹配到的,默认匹配它
echo "回家多学会,再来玩"
esac
运行结果
[root@ shanan ~]# sh test4.sh
请问你出什么 石头1 剪刀2 布3 : 1
你输了,电脑出的布,你出的石头
[root@ shanan ~]# sh test4.sh
请问你出什么 石头1 剪刀2 布3 : 2
你输了,电脑出的石头,你的剪刀
[root@ shanan ~]# sh test4.sh
请问你出什么 石头1 剪刀2 布3 : 3
你输了,电脑出的剪刀,你出的布
[root@ shanan ~]# sh test4.sh
请问你出什么 石头1 剪刀2 布3 : 4566
回家多学会,再来玩