文章目录
Shell 编程----条件语句
一:条件测试
1.1:文件测试与整数测试
1.1.1:文件测试
-
test 命令
测试表达式是否成立,若成立返回0,否则返回其他数值.
格式1: [test 条件表达式]
格式2: [ 条件表达式 ]
注意:格式2中表达式与中括号之间要有空格,否则语法错误.
-
文件测试
[ 操作符 文件或目录 ]
常用的测试操作符
常见的测试操作符 解释 -d 测试是否为目录(directory) -e 测试目录或文件是否存在(Exist) -f 测试是否为文件(File) -r 测试当前用户是否有权限读取(Read) -w 测试当前用户是否有权限写入(Write) -x 测试当前用户是否有权限执行(eXcute) 注意: 测试文件推荐用绝对路径
[root@shell ~]# touch abc.txt [root@shell ~]# test -f abc.txt [root@shell ~]# echo $? 0 [root@shell ~]# test -d abc.txt [root@shell ~]# echo $? 1 [root@shell ~]# [-d abc.txt] bash: [-d: 未找到命令... '注意中括号要有空格,要不然报错' [root@shell ~]# [ -d abc.txt ] [root@shell ~]# echo $? 1 [root@shell ~]# [ -f abc.txt ] [root@shell ~]# echo $? 0[root@shell ~]# [ -d /dev/cdrom ] [root@shell ~]# echo $? 1 [root@shell ~]# [ -f /dev/cdrom ] [root@shell ~]# echo $? 1 [root@shell ~]# [ -e /dev/cdrom ] [root@shell ~]# echo $? 0 [root@shell ~]# [ -e /dev/cdrom ]&& echo "yes" yes [root@shell ~]# [ -d /dev/cdrom ]&& echo "yes" [root@shell ~]# [ -f /dev/cdrom ]&& echo "yes" '注意&& 前面成立继续执行后面内容 '&&前面不成立不执行后面的内容'
1.1.2: 整数值比较
-
[ 整数1 操作符 整数2 ]
-
操作符 解释 -eq 等于(Equal) -ne 不等于(Not Equal) -gt 大于(Greater Than) -lt 小于(Lesser Than) -le 小于或等于(Lesser or Equal -ge 大于或等于(Greater or Equal) -
[root@shell ~]# [ 55 -gt 80 ] && echo "yes" [root@shell ~]# [ 80 = 80 ] && echo "yes" yes [root@shell ~]# [ 80 == 80 ] && echo "yes" yes [root@shell ~]# [root@shell ~]# [ 'zhangsan' == 'zhangsan' ] && echo yes yes [root@shell ~]# [ 'zhangsan' -eq 'zhangsan' ] && echo yes bash: [: zhangsan: 期待整数表达式 [root@shell ~]# [ 'zhangsan' == 'zhang' ] && echo yes [root@shell ~]# [ ! 'zhangsan' == 'zhang' ] && echo 'yes'[root@shell ~]# who | wc -l 3 [root@shell ~]# [ $(who | wc -l) -gt 5 ] && echo "Too many" [root@shell ~]# [ $(who | wc -l) -gt 5 ] && echo ">=1" [root@shell ~]# echo $? 1 [root@shell ~]# [ $(who | wc -l) -gt 2 ] && echo ">=2" >=2[root@shell ~]# free -m total used free shared buff/cache available Mem: 3771 756 2219 57 794 2649 Swap: 8191 0 8191 [root@shell ~]# FreeCC=$(free -m |grep "Mem:"| awk '{print $6}') [root@shell ~]# echo $FreeCC 794 [root@shell ~]# [ $FreeCC -lt 1024 ] && echo ${FreeCC} MB 794 MB '注意这里不能用$( ),这表示括号里面是命令,不能是变量,${}里面可以是变量' '一般情况下,$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围,主要用来变量替换'
1.2:字符串测试与逻辑测试
1.2.1: 字符串的比较
-
常用的格式
格式一:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式二:[ -z 字符串 ]常用的测试操作符 解释 = 第一个字符串与第二个字符串内容相同 != 第一个字符串与第二个字符串内容不同,!号表示相反的意思 -z 检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串
[root@shell ~]# echo $LANG
zh_CN.UTF-8
[root@shell ~]# [ $LANG = "en_us" ] && echo "yes"
[root@shell ~]# [ ! $LANG = "en_us" ] && echo "yes"
yes
[root@shell ~]# [ "男" = "男" ] && echo 'yes'
yes
[root@shell ~]# [ ! "男" = "男" ] && echo 'yes'
[root@shell ~]# [ "男" != "男" ] && echo 'yes'
[root@shell ~]# [ "男" != "女" ] && echo 'yes'
yes
[root@shell ~]# [ "男" = "女" ] && echo 'yes'
[root@shell ~]#
[root@shell ~]# vi test02.sh
#!/bin/bash
[ ! -e /opt/share ] && echo "不存在" || mkdir /opt/share && echo "创建成功"
[root@shell ~]# sh test02.sh
mkdir: 无法创建目录"/opt/share": 文件已存在
[root@shell ~]# rm -rf /opt/share/
[root@shell ~]# sh test02.sh
不存在
创建成功
1.2.2: 逻辑测试
-
基本格式
格式一: [ 表达式1 ] 操作符 [ 表达式2 ] …
格式二: 命令1 操作符 命令2 … -
且:第一个不成立就不去读第二个
或:都读
-
[root@shell ~]# [ -d /etc ] && [ -r /etc ] && echo "yes" yes [root@shell ~]# [ -d /etc ] -a [ -r /etc ] && echo "yes" -bash: [: 参数太多 '-a不是可选项' [root@shell ~]# [ 1 -eq 1 -a 2 -eq 2 ] && echo "yes" yes '-a和-o也可使用在[]中,更加方便'
1.2.3: 一元运算符,二元运算符和三元运算符
-
一元运算符
带一元运算符的表达式遵循从右到左的结合性,常见的一元表达式:++一元表达式,–一元表达式
-
前缀自增运算符与前缀自减运算符
-
在一元表达式的前面添加运算符++或–后得到的表达式是一个一元表达式。操作数将被加1(++)或减1(–),表达式的值是经过加1、减1 以后的值。操作数必须是一个左值。
-
i=1;
-
i++: i=$i+1
-
i=i++:先赋值在运算
-
i=++i:先自加在赋值
-
i=–i:先自减在赋值
[root@localhost opt]# i=1
[root@localhost opt]# echo $i
1
[root@localhost opt]# let i=++i
[root@localhost opt]# echo $i
2
[root@localhost opt]# let i+=2 '相当于i=i+2'
[root@localhost opt]# echo $i
4
-
二元运算符
a + b = c
-
三元运算符
条件&&结果1 || 结果2
二:if语句
2.1:if单分支语句
-
单分支结构(基本格式)
if 条件测试操作
then 命令序列
fi
-
exit 1 异常退出
exit 0 正常退出
-
实操演示
'单分支if语句' [root@shell ~]# vim test03.sh #!/bin/bash read -p "请输入目录位置" file if [ ! -d $file ];then mkdir -p $file echo "$file 已创建" fi [root@shell ~]# sh test03.sh 请输入目录位置:/123 /123 已创建
2.2:if 双分支语句
-
双分支结构(基本格式)
if 条件测试操作
then 命令序列1
else 命令序列2
fi -

-
演示
[root@shell ~]# vim test03.sh #!/bin/bash read -p "请输入目录位置:" file if [ -d $file ];then echo "目录已存在" else mkdir -p $file echo "$file已创建" fi [root@shell ~]# sh test03.sh 请输入目录位置:123 123已创建 [root@shell ~]# [root@shell ~]# sh test03.sh 请输入目录位置:123 目录已存在[root@shell ~]# vim pinghost.sh #!/bin/bash ping -c 3 -i 0.2 -W 3v $1 &> /dev/null if [ $? -eq 0 ] then echo "Host $1 is Up" else echo "Host $1 is down" fi [root@shell ~]# vim pinghost.sh #!/bin/bash ping -c 3 -i 0.2 -W 3v $1 &> /dev/null if [ $? -eq 0 ] then echo "Host $1 is Up" else echo "Host $1 is down" fi [root@shell ~]# sh pinghost.sh 14.0.0.1 Host 14.0.0.1 is down [root@shell ~]# sh pinghost.sh www.baidu.com Host www.baidu.com is Up 注意: -c:发送三个包 -i: 发包间隔0.2秒 -W:等待时间3秒
2.3:if 多分支语句
-
多分支结构(基本格式)
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi -

[root@shell ~]# vim chengji02.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
[root@shell ~]# sh chengji02.sh
请输入成绩:88
成绩优秀
[root@shell ~]# sh chengji02.sh
请输入成绩:82
成绩合格
[root@shell ~]#
[root@shell ~]# sh chengji02.sh
请输入成绩:111
输入有误
三:case 分支语句
3.1:case 分支语句
-
针对变量的不同取值,分别执行不同的命令序列
-
这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句指示判断一个变量的不同取值
-
;;双分号表示模式结束,不能省略
*)等同于else,都没有匹配,则执行默认命令序列
case 常常匹配值
if else 常匹配区间
case 往往表示菜单几个选项,模式清单,选项给你选
格式: case 变量值 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; .... *) 默认命令序列 esac
[root@shell ~]# vim hitkey.sh
1 #!/bin/bash
2 read -p "请输入一个字符,并按回车" key
3 case "$key" in
4 [a-z]|[A-Z])
5 echo "您输入的是字母"
6 ;;
7 [0-9])
8 echo "您输入的是数字"
9 ;;
10 *)
11 echo "您输入的是空格,功能键和其他控制字符串"
12 esac
[root@shell ~]# sh hitkey.sh
请输入一个字符,并按回车1
您输入的是数字
[root@shell ~]# sh hitkey.sh
请输入一个字符,并按回车A
您输入的是字母
-
判断学生成绩的优良
-
成绩0-100分
-
0-59分:不及格
-
60-74:及格
-
75-84:良好
-
85-100:优秀
[root@shell ~]# vim chengji03.sh
#!/bin/bash
read -p "请输入你的成绩:" aa
case "$aa" in
#[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])
[1-5][0-9]|[0-9])
echo "你的成绩不合格"
;;
6[0-9]|7[0-4])
echo "你的成绩合格"
;;
7[5-9]|8[0-4])
echo "你的成绩良好"
;;
8[5-9]|9[0-9]|100)
echo "你的成绩优秀"
;;
*)
echo "输入有误"
esac
[root@shell ~]# sh chengji03.sh
请输入你的成绩:88
你的成绩优秀
[root@shell ~]# sh chengji03.sh
请输入你的成绩:50
你的成绩不合格
[root@shell ~]# sh chengji03.sh
请输入你的成绩:0
你的成绩不合格
[root@shell ~]# sh chengji03.sh
请输入你的成绩:70
你的成绩合格
3.2:case 嵌套
-
格式:
case 变量值 in
模式1)
case 变量值 in 模式1)
命令序列
;;
*)
命令序列
esac
;;
模式2)
命令序列2
;;
…
*)
默认命令序列
esac
'10秒内,进决赛'
#!/bin/bash
read -p "请输入性别" sex
read -p "成绩" score
case $sex in
male)
case $score in
[0-9] | 10)
echo "你已进入男子组决赛"
;;
*)
echo "你未进入男子组决赛"
esac
;;
female)
case $score in
[0-9] | 10)
echo "你已进入女子组决赛"
;;
*)
echo "你未进入女子组决赛"
esac
;;
esac
[root@shell ~]# sh baimi.sh
请输入性别male
成绩5
你已进入男子组决赛
[root@shell ~]# sh baimi.sh
请输入性别female
成绩11
你未进入女子组决赛
2247

被折叠的 条评论
为什么被折叠?



