通常在云计算运维中,通常会用到shell和python,今天介绍shell当中的if和case语句,来完成测试判断,以减少程序的运行错误。
目录
概述一:条件测试1.1:test命令1.2:文件测试 文件类型跟权限测试1.3:整数值比较1.4:字符串比较1.5:逻辑测试
二:if 语句的结构2.1:单分支结构2.2:双分支结构2.3:多分支结构2.4:多分支实例
三:case语句
概述
在shell脚本中的各种条件结构和流程控制都要进行各种的测试,然后根据测试的结果执行不同的操作,有时也会和if语句结合,来完成测试判断,以减少程序的运行错误。 也就是说,当我们在写一个脚本,里面没有任何的判断,就写了一些很普通的命令,那么在我们运行脚本的时候,当遇到了错误,也会一直的执行下去,这样就导致了我们脚本执行的结果是错误的。 这时候我们就会用到我们的条件测试比较。 那么在执行条件测试中通常会返回 “真”或者“假”就像我们执行一条成功的命令,那么执行完这条命令 我们echo$? 如果它返回的是0 那么就是真的返回的状态是非0那么就是假的 也就是错的。
一:条件测试
1.1:test命令
测试表达式是否成立,若成立返回0,否则返回其他数值
格式
1:test 条件表达式
格式
2:【 条件表达式 】 #注意两端要有空格
:
#文件测试
1.2:文件测试 文件类型跟权限测试
[操作符 文件或目录
]
&? 返回
0表示条件成立,返回非零值表示条件不成立
&& 逻辑与,
"而且"的意思
|| 逻辑或,
"或者"的意思
常见的测试操作符解释
-d测试是否为目录(directory)-e测试目录或文件是否存在(Exist)-f测试是否为文件(File)-r测试当前用户是否有权限读取(Read)-w测试当前用户是否有权限写入(Write)-x测试当前用户是否有权限执行(eXcute)
[root
@localhost ~]# touch a
.txt
[root
@localhost ~]# test
-f a
.txt
[root
@localhost ~]# echo $
?
0
[root
@localhost ~]# test
-d a
.txt
[root
@localhost ~]# echo $
?
1
[root
@server1 test
]# mkdir tom
[root
@server1 test
]# ls
tom
[root
@server1 test
]#
[ -x
/test
/tom
]
[root
@server1 test
]# echo $
?
0
[root
@server1 test
]# ll
总用量
0
drwxr
-xr
-x
. 2 root root
6 10月
7 19:31 tom
echo $
? 查询上个步骤是否成立,成立则为
0,不成立则为非
0值
&& 是而且的含义 表示如果两边的条件都成立,才会正确执行;echo
"yes"很明显是正确的
[root
@server1 test
]#
[ -e
/dev
/cdrom
]&& echo
"yes"
yes
[root
@server1 test
]# test
-e
/dev
/cdrom
&& echo
"yes"
yes
1.3:整数值比较
整数值比较
命令基本格式
[ 整数
1 操作符 整数
2 ]
常用的测试操作符
操作符解释
-eq等于(Equal)-ne不等于(Not Equal)-gt大于(Greater Than)-lt小于(Lesser Than)-le小于或等于(Lesser or Equal)-ge大于或等于(Greater or Equal)
[root
@server1 test
]#
[ -e
/dev
/cdrom
]&& echo
"yes"
yes
[root
@server1 test
]# test
-e
/dev
/cdrom
&& echo
"yes"
yes
[root
@server1 test
]#
[ 33 -eq
33 ] && echo
"yes"
yes
[root
@server1 test
]#
[ 33 = 33 ] && echo
"yes"
yes
[root
@server1 test
]#
[ 33 == 33 ] && echo
"yes"
yes
#数值比较用
-eq
[root
@server1 test
]#
[ "tom" == "tom" ] && echo
"yes"
yes
[root
@server1 test
]#
[ "tom" -eq
"tom" ] && echo
"yes"
bash
: [: tom
: 期待整数表达式
#本身不成立的可以取反成立
[root
@server1 test
]#
[ ! "jerry" == "jerryjunior" ] && echo
"yes"
yes
命令前面加括号或者反撇
[root
@server1 test
]#
[ $
(who
|wc
-l
) -lt
3 ]&& echo
"Too many."
Too many
.
#who查看当前登录的用户。
#who
| wc
-l :将who的输出作为wc的输入,wc为统计行数,单词数及字符个数,
-l 表示统计行数。
查看内存信息
[root
@server1 test
]# free
-m
total used free shared buff
/cache available
Mem
: 1823 730 470 18 622 854
Swap
: 2047 0 2047
[root
@server1 test
]# free
-m
|grep
"Mem:"
Mem
: 1823 730 470 18 622 853
[root
@server1 test
]# free
-m
|grep
"Mem:"| awk
'{print $4}'
470
[root
@server1 test
]# tom
=$
(free
-m
|grep
"Mem:"| awk
'{print $4}')
[root
@server1 test
]#
[ $tom
-gt
100 ]&& echo
'tom good'
tom good
[root
@server1 test
]#
[ $tom
-gt
100 ]&& echo
"$tom MB"
469 MB
[root
@server1 test
]#
[ $tom
-gt
100 ]&& echo
"$tom"MB
469MB
[root
@server1 test
]#
[ $tom
-gt
100 ]&& echo $
{tom
}MB
469MB
#$跟大括号表示一个变量'
1.4:字符串比较
常用的格式
格式一:
[ 字符串
1 = 字符串
2 ]
[ 字符串
1 !
= 字符串
2 ]
格式二:
[ -z 字符串
]
常用的测试操作符解释
=第一个字符串与第二个字符串内容相同!=第一个字符串与第二个字符串内容不同,!号表示相反的意思-z检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串
#两个字符串不相等
[root
@server1 test
]#
[ $tom
!= "no" ]&&echo
"no"
no
[root
@server1 test
]#
[ -z
'' ]&&echo
"yes"
yes
[root
@server1 test
]#
[ -z
' ' ]&&echo
"yes"
[root
@server1 test
]#
[ -z
"" ]&&echo
"yes"
yes
[root
@server1 test
]#
[ "tom" = "tom" ]&&echo
"yes"
yes
[root
@server1 test
]#
[ "tom" = "jerry" ]&&echo
"yes"
[root
@server1 test
]#
[ "tom" != "jerry" ]&&echo
"yes"
yes
#
!/bin
/bash
read
-p
"是否输入[yes/no]:" dd
[ $dd
= "yes" ]&&echo
"输入"
[root
@server1 test
]# sh test
.txt
是否输入
[yes
/no
]:yes
输入
[root
@server1 test
]# sh test
.txt
是否输入
[yes
/no
]:no
[root
@server1 test
]# vi test
.txt
创建用户
#
!/bin
/bash
read
-p
"是否创建用户(yes/no):" dd
[ $dd
= yes
]&& useradd jerry
echo
"用户jerry创建成功"
[root
@server1 test
]# sh a
.txt
是否创建用户(yes
/no
):yes
用户jerry创建成功
创建文件
#
!/bin
/bash
read
-p
"是否创建/test/jerry目录(yes/no):" dd
[ -d
/test
/jerry
]&& echo
"/test/jerry" || mkdir
/test
/jerry
&& echo
"目录创建完成"
[root
@server1 test
]# sh b
.txt
是否创建
/test
/jerry目录
(yes
/no
):^[[A
/test
/jerry
目录创建完成
1.5:逻辑测试
基本格式
格式一:
[ 表达式
1 ] 操作符
[ 表达式
2 ] ...
格式二: 命令
1 操作符 命令
2 ...
常用的测试操作符解释
&&逻辑与,“而且”的意思,使用test命令测试时,可将“&&”改为“-a”ll逻辑或,“或者”的意思,使用test命令测试时,可将“!逻辑否
[root
@server1 test
]#
[ -d
/etc
] && [ -r
/etc
] && echo
"yes"
yes
[root
@server1 test
]#
[ -d
/etc
] || [ -r
/etc
] && echo
"yes"
yes
二:if 语句的结构
2.1:单分支结构
单分支结构(基本格式)
if 条件测试操作
then 命令序列
fi
在这里插入代码片
单分支结构(举例)
if 磁盘已用空间
>70%
then 报警
fi
单分之针对成立 exit 1异常退出 exit 0正常退出
#
!/bin
/bash
read
-p
"请输入目录位置:" DD
if [ ! -d $DD
]
then
mkdir
-p $DD
echo
"$DD创建完成"
fi
[root
@server1 test
]# sh c
.sh
请输入目录位置:
/test
/jiesi
/test
/jiesi创建完成
[root
@server1 test
]# ll
总用量
16
-rw
-r
--r
--. 1 root root
116 10月
7 22:28 a
.txt
-rw
-r
--r
--. 1 root root
154 10月
7 22:39 b
.txt
-rw
-r
--r
--. 1 root root
120 10月
7 23:34 c
.sh
drwxr
-xr
-x
. 2 root root
6 10月
7 22:38 jerry
drwxr
-xr
-x
. 2 root root
6 10月
7 23:35 jiesi
-rw
-r
--r
--. 1 root root
81 10月
7 22:19 test
.txt
drwxr
-xr
-x
. 2 root root
6 10月
7 19:31 tom
2.2:双分支结构
双分支结构(基本格式)
if 条件测试操作
then 命令序列
1
else 命令序列
2
fi
双分支结构(举例)
if 80端口是否在监听
then 网站服务已在运行
else 启动httpd服务
fi
#
!/bin
/bash
read
-p
"请输入IP地址:" dd
ping
-c
3 -i
0.2 -W
3 $shuai $
>/dev
/null
#
-c:发送包
-i:发送间隔
-W:等待时间
if [ $
? -eq
0 ]
then
echo
"host $dd is up"
else
echo
"host $dd is down"
fi
[root
@server1 test
]# sh e
.sh
请输入IP地址:
8.8.8.8
ping
: $
: 未知的名称或服务
host
8.8.8.8 is down
#
!/bin
/bash
read
-p
"请输入目录位置:" dd
if [ -d $dd
]
then
echo
"目录已存在"
else
mkdir
-p $dd
fi
[root
@server1 test
]# sh f
.sh
请输入目录位置:
/test
/pyb
[root
@server1 test
]# sh f
.sh
请输入目录位置:pyb
目录已存在
2.3:多分支结构
多分支结构(基本格式)
if 条件测试操作
1
then 命令序列
1
elif 条件测试操作
2
then 命令序列
2
else
命令序列
3
fi
多分支结构(举例)
if 分数为
80~100之间
then 判为优秀
elif 分数为
60~79之间
then 判为合格
else
判为不合格
fi
2.4:多分支实例
#输入成绩,
0-60(几个);
60-80(合格);
80-100(优秀)
#
!/bin
/bash
read
-p
"请输入成绩:" score
if [ $score
-lt
0 ] || [ $score
-gt
100 ]
then
echo
"输入有误"
exit
1;
elif
[ $score
-ge
80 ] && [ $score
-le
100 ]
then
echo
"成绩优秀"
elif
[ $score
-ge
60 ] && [ $score
-le
80 ]
then
echo
"成绩合格"
else
echo
"成绩不合格"
fi
[root
@server1 test
]# sh grade
.sh
请输入成绩:
55
成绩不合格
[root
@server1 test
]# sh grade
.sh
请输入成绩:
80
成绩优秀
[root
@server1 test
]# sh grade
.sh
请输入成绩:
77
成绩合格
[root
@server1 test
]# sh grade
.sh
请输入成绩:
18
成绩不合格
[root
@server1 test
]# sh grade
.sh
请输入成绩:
102
输入有误
[root
@server1 test
]# sh grade
.sh
请输入成绩:
-3
输入有误
#输入睡眠时间,
0-6(少);
6-8(很好);
8-24(太多了);其他(输入有误,一天只要
24小时)
#
!/bin
/bash
read
-p
"请问你一天睡了几小时:" sleep
if [ $sleep
-ge
0 ] && [ $sleep
-le
24 ]
then
if [ $sleep
-ge
6 ] && [ $sleep
-le
8 ]
then echo
"睡眠很好"
elif
[ $sleep
-ge
1 ] && [ $sleep
-le
5 ]
then echo
"您睡的太少了,请注意身体"
else
echo
"您睡的太多啦,努力学习"
fi
else
echo
"一天只要24小时哦"
fi
[root
@server1 test
]# sh shengti
.sh
请问你一天睡了几小时:
4
您睡的太少了,请注意身体
[root
@server1 test
]# sh shengti
.sh
请问你一天睡了几小时:
7
睡眠很好
[root
@server1 test
]# sh shengti
.sh
请问你一天睡了几小时:
16
您睡的太多啦,努力学习
[root
@server1 test
]# sh shengti
.sh
请问你一天睡了几小时:
26
一天只要
24小时哦
三:case语句
case 语句和 if…elif…else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。
#
!/bin
/bash
read
-p
"请输入性别:" sex
read
-p
"请输入成绩:" score
case $sex in
男
)
case $score in
[1-9]|10)
echo
"你进入男子组"
;;
*)
echo
"你没有进入男子组"
esac
;;
女
)
case $score in
[1-9]|10)
echo
"你进入女子组"
;;
*)
echo
"你没有进入女子组"
esac
;;
*)
echo
"您输入的性别错误"
esac
[root
@server1 test
]# sh running
.sh
请输入性别
:女
请输入成绩
:6
你进入女子组
[root
@server1 test
]# sh running
.sh
请输入性别
:男
请输入成绩
:11
你没有进入男子组
如果您觉得有用的话,给个三连吧! 有任何问题,都可私信博主,或者在评论区留言。。。