shell条件语句理解及应用
文章目录
一、条件测试
【1】文本测试与整数测试
常见的操作符有:
-d:测试是否为目录(directory)
-e:测试目录或者文件是否存在(exist)
-f:测试是否为文件(file)
-r:测试当前用户是否有读取权限(read)
-w:测试当前用户是否有写入权限(write)
-x:测试当前用户是否有执行权限(excute)
(1)test命令
测试表达式是否成立,若成立返回0,否则返回其他值
格式1:test 条件表达式
格式2:[ 条件表达式 ] #####中括号中两端都有空格
[root@localhost opt]# test -f abc.sh
[root@localhost opt]# echo $?(上一次执行命令是否成立,0表示成立,1表示不成立)
0
[root@localhost opt]# test -d abc.sh
[root@localhost opt]# echo $?
1
[root@localhost opt]# test -e /etc/sr0 && echo "yes"(如果前面的语句不成立则不执行后面的语句)
[root@localhost opt]# test -e /dev/sr0 && echo "yes"(&&表示如果前面的语句成立则执行下面的语句)
yes
[root@localhost opt]#
(2)文件测试
格式:[ 操作符 文件或目录 ] ######注意空格
[root@localhost opt]# [ -e abc.sh ](查看文件是否存在)
[root@localhost opt]# echo $?(0表示存在)
0
[root@localhost opt]# [ -x abc.sh ](查看文件是否有执行权限)
[root@localhost opt]# echo $?(1表示没有)
1
[root@localhost opt]# [ -r abc.sh ]&&echo "yes"(&&表示如果前面的语句成立则执行下面的语句)
yes
[root@localhost opt]# [ -x abc.sh ]&&echo "yes"(如果前面的语句不成立则不执行后面的语句)
[root@localhost opt]# [ -w abc.sh ]&&echo "yes"
yes
[root@localhost opt]#
(3)整数值的比较
格式:[ num1 操作符 num2 ](注意中括号中两端要空格)
常见的操作符有:
-eq:等于(equal)
-ne:不等于(not equal)
-gt:大于(greater than)
-lt:小于(lesser than)
-le:小于等于(lesser or equal)
-ge:大于等于(greater or equal)
举例理解:
[root@localhost opt]# [ 80 -le 80 ]&& echo "yes"
yes
[root@localhost opt]# [ 80 -gt 90 ]&& echo "yes"
[root@localhost opt]#
查看虚拟磁盘大小情况:
[root@localhost opt]# free -m(查看内存空间)
total used free shared buff/cache available
Mem: 972 598 60 28 313 161
Swap: 2047 18 2029
[root@localhost opt]# free -m |grep "Swap:" |awk '{ print $4 }'
2029
########(检索出Swap:并提取剩余空间大小)#########3
[root@localhost opt]# freeswap=$(free -m |grep "Swap:" |awk '{ print $4 }')
########(把剩余空间大小赋值个freeswap变量)########
[root@localhost opt]# [ $(free -m |grep "Swap:" |awk '{ print $4 }') -gt 2000 ]&& echo "$freeswap"MB
2029MB
########(大于2000输出大小,单位是MB)#########
[root@localhost opt]#
【2】字符串测试与逻辑测试
(1)字符串测试
=或==:字符串的比较相同
!=:字符串比较不相同
-z:字符串内容为空
举例说明:
[root@localhost opt]# [ 80 != 080 ]&& echo "yes"
yes
[root@localhost opt]# [ 80 = 080 ]&& echo "yes"
[root@localhost opt]# [ 80 = 80 ]&& echo "yes"
yes
[root@localhost opt]# [ 80 == 80 ]&& echo "yes"
yes
[root@localhost opt]# [ -z '' ]&&echo "yes"
yes
[root@localhost opt]# [ -z "" ]&&echo "yes"
yes
[root@localhost opt]# [ -z " " ]&&echo "yes"
[root@localhost opt]# [ -z ' ' ]&&echo "yes"
(2)逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:命令1 操作符 命令2
常见的操作符有:
-a或&&:逻辑与,同时成立
-o或||:逻辑或,一个成立就可以
!:逻辑否,取反
举例说明:
[root@localhost opt]# [ -d /etc ]&& [ -x /etc ]&& echo "you can open it"
you can open it
[root@localhost opt]# [ -f /etc ]&& [ -x /etc ]&& echo "you can open it"
[root@localhost opt]# [ -f /etc ]|| [ -x /etc ]&& echo "are you sure?"
are you sure?
[root@localhost opt]# [ ! -f /etc ]&& [ -x /etc ]&& echo "you can open it"
you can open it
二、if语句
【1】if单分支语句
(1)结构图
(2)语法
语法1:
if [ 条件 ]
then
命令集
fi
语法2:
if [条件]:then
命令集
fi
【2】if双分支语句
(1)结构图
(2)语法:
if [ 条件测试表达式 ];then
命令1
else
命令2
fi
【3】if多分支语句
(1)结构示意图
(2)语法:
if [ 条件测试表达式1 ];then
命令1
elif [ 条件表达式2 ];then
命令2
else
命令3
fi
三、case语句
(1)结构示意图
(2)语法:
case $num in
[0-9][1-9]|100)######"|"表示或
echo "这是1-100之间的数"
;;
男)
echo "一个汉字"
esac
case $num1 in
[0-9][1-9]|100)
echo "这是1-100之间的数"
;;
女)
echo "一个汉字"
;;
*)
echo "*表示除了上面的条件之外"
esac
......
四、条件语句应用实例
【1】10秒晋级分男女组
第一种方法:(if条件语句)
[root@localhost opt]# vim time.sh
#!/bin/bash
#name=time
read -p "请输入你的比赛成绩:" score
if [ $score -le 10 ]&&[ $score -gt 0 ];then
echo "恭喜你进入决赛!"
read -p "性别(男/女):" gender
if [ $gender = "男" ];then
echo "你是男子组"
else
echo "你是女子组"
fi
else
echo "你被淘汰了"
fi
[root@localhost opt]# sh time.sh
请输入你的比赛成绩:5
恭喜你进入决赛!
性别(男/女):男
你是男子组
[root@localhost opt]# sh time.sh
请输入你的比赛成绩:12
你被淘汰了
[root@localhost opt]# sh time.sh
请输入你的比赛成绩:6
恭喜你进入决赛!
性别(男/女):女
你是女子组
第二种方法:(case条件语句)
[root@localhost opt]# vim time1.sh
#!/bin/bash
#case方式实现10秒晋级,分男女组!
read -p "你的分数score是:" score
case $score in
[1-9]|10)
echo "恭喜你,you pass"
read -p "你的性别gender是:" gender
case $gender in
男)
echo "你是男子组"
;;
女)
echo "你是女子组"
esac
;;
*)
echo "很遗憾,you out"
esac
[root@localhost opt]# sh time1.sh
你的分数score是:4
恭喜你,you pass
你的性别gender是:男
你是男子组
[root@localhost opt]# sh time1.sh
你的分数score是:12
很遗憾,you out
[root@localhost opt]# sh time1.sh
你的分数score是:5
恭喜你,you pass
你的性别gender是:女
你是女子组
【2】石头、剪刀、布游戏
第一种方法:(多分支if语句)
[root@localhost opt]# vim four.sh
#!/bin/bash
#name=four
#This is a game!
echo "石头=1、剪刀=2、布=3"
read -p "请随机输入1或2或3:" num1
num=$(($RANDOM%3 + 1))
if [ $num1 -ge 1 ] && [ $num1 -le 3 ];then
if [ $num -eq 1 ] && [ $num1 -eq 3 ];then
echo "恭喜哦,你赢了"
elif [ $num -eq 1 ] && [ $num1 -eq 2 ];then
echo "你输了,不要灰心"
elif [ $num -eq 2 ] && [ $num1 -eq 1 ];then
echo "恭喜哦,你赢了"
elif [ $num -eq 2 ] && [ $num1 -eq 3 ];then
echo "你输了,不要灰心"
elif [ $num -eq 3 ] && [ $num1 -eq 2 ];then
echo "恭喜哦,你赢了"
elif [ $num -eq 3 ] && [ $num1 -eq 1 ];then
echo "你输了,不要灰心"
else
echo "平局,再来"
fi
else
echo "你违规了"
fi
[root@localhost opt]# sh four.sh
石头=1、剪刀=2、布=3
请随机输入1或2或3:2
你输了,不要灰心
[root@localhost opt]# sh four.sh
石头=1、剪刀=2、布=3
请随机输入1或2或3:1
恭喜哦,你赢了
[root@localhost opt]# sh four.sh
石头=1、剪刀=2、布=3
请随机输入1或2或3:3
恭喜哦,你赢了
[root@localhost opt]# sh four.sh
石头=1、剪刀=2、布=3
请随机输入1或2或3:4
你违规了
第二种方法:(case语句和多分支if语句)
[root@localhost opt]# vim four1.sh
#!/bin/bash
#石头=1,剪刀=2,布=3
num=($(($RANDOM%3+1)))
read -p "请出石头、剪刀、布:" num1
case $num in
1)
if [ $num1 = '剪刀' ];then
echo "电脑出的是石头,很遗憾你输了!"
elif [ $num1 = '布' ];then
echo "电脑出的是石头,恭喜你赢了哦!"
elif [ $num1 = '石头' ];then
echo "旗鼓相当,再来一次呀!"
else
echo "要好好玩哦,请出石头、剪刀、布!"
fi
;;
2)
if [ $num1 = '布' ];then
echo "电脑出的是剪刀,很遗憾你输了!"
elif [ $num1 = '石头' ];then
echo "电脑出的是剪刀,恭喜你赢了哦!"
elif [ $num1 = '剪刀' ];then
echo "旗鼓相当,再来一次呀!"
else
echo "要好好玩哦,请出石头、剪刀、布!"
fi
;;
3)
if [ $num1 = '石头' ];then
echo "电脑出的是布,很遗憾你输了!"
elif [ $num1 = '剪刀' ];then
echo "电脑出的是布,恭喜你赢了哦!"
elif [ $num1 = '布' ];then
echo "旗鼓相当,再来一次呀!"
else
echo "要好好玩哦,请出石头、剪刀、布!"
fi
esac
[root@localhost opt]# sh four1.sh
请出石头、剪刀、布:bu
要好好玩哦,请出石头、剪刀、布!
[root@localhost opt]# sh four1.sh
请出石头、剪刀、布:布
电脑出的是剪刀,很遗憾你输了!
[root@localhost opt]# sh four1.sh
请出石头、剪刀、布:剪刀
电脑出的是石头,很遗憾你输了!
[root@localhost opt]# sh four1.sh
请出石头、剪刀、布:石头
旗鼓相当,再来一次呀!
[root@localhost opt]# sh four1.sh
请出石头、剪刀、布:布
旗鼓相当,再来一次呀!
[root@localhost opt]# sh four1.sh
请出石头、剪刀、布:石头
电脑出的是剪刀,恭喜你赢了哦!
第三种方法:(总结第二种方式)
[root@localhost opt]# vim four2.sh
#!/bin/bash
echo "石头=1、剪刀=2、布=3"
read -p "请随机输入1或2或3:" num1
num=$(($RANDOM%3 + 1))
if [ $num1 -ge 1 ] && [ $num1 -le 3 ];then
if [ $num -eq 1 -a $num1 -eq 3 ]||[ $num -eq 2 -a $num1 -eq 1 ]||[ $num -eq 3 -a $num1 -eq 2 ];then
echo "恭喜哦,你赢了"
elif [ $num -eq 3 -a $num1 -eq 1 ]||[ $num -eq 1 -a $num1 -eq 2 ]||[ $num -eq 2 -a $num1 -eq 3 ];then
echo "你输了,不要灰心"
else
echo "平局,再来"
fi
else
echo "你违规了"
fi
【3】成绩评分
[root@localhost opt]# vim sorce.sh
#!/bin/bash
#name=score
#this is score menu!
read -p "请输入你的成绩:" score
case "$score" in
8[0-9]|9[0-9]|100)
echo "你的成绩是优秀!"
;;
7[0-9])
echo "你的成绩是良好!"
;;
6[0-9])
echo "你的成绩是合格!"
;;
[1-5][0-9]|0)
echo "你的成绩是不及格!"
;;
*)
echo "你就是弟弟!"
esac
[root@localhost opt]# sh score.sh
请输入你的成绩:123
你就是弟弟!
[root@localhost opt]# sh score.sh
请输入你的成绩:56
你的成绩是不及格!
[root@localhost opt]# sh score.sh
请输入你的成绩:100
你的成绩是优秀!
[root@localhost opt]# sh score.sh
请输入你的成绩:0
你的成绩是不及格!
[root@localhost opt]# sh score.sh
请输入你的成绩:79
你的成绩是良好!