您的位置:首页 > 运维架构 > Shell

Linux Bash Shell编程(九):流程控制语句(上) 分支语句(if、case)

2020-08-16 16:55 931 查看

  上一节中,我们学习了Bash中各种类型的条件判断语句。在Bash中,流程控制是条件判断语句的最终目的,条件判断语句是流程设计的基础条件。本节开始我们就来一起探索Bash中的流程控制语句,首先我们会了解到分支语句

if
case

if 判断语句

 简介

  流程控制是编程语言基础中的基础,

if
语句和
case
语句一起实现了程序语言的三种结构(顺序结构、分支结构、循环结构)之一的分支结构。简单说,
if
语句判断了条件的真假,定义了条件为真做什么(,为假做什么)。

 语法

#单分支if语句
if [ 判断条件 ]; then
动作
fi
#或者
if [ 判断条件 ]
then
动作
fi

#多分支if语句
if [ 判断条件1 ]; then
动作1
elif [ 判断条件2 ]; then
动作2
elif [ 判断条件3 ]; then
动作3
...
else
动作n
fi

 注意

  • 小知识:在Shell脚本中使用

    cd
    命令仅对脚本内部有效,不影响外部环境

  • 若要设定脚本的返回值,使用

    exit
    命令后跟返回值可完成

exit 0 #以0为返回值退出,默认
exit 1 #以1为返回值退出,一般为发生错误或中断

 示例

示例1:利用(七)中所学字符串截取操作获取根目录文件系统占用率并在过高时报警

#以下是脚本df中内容

#!/bin/bash

#Author:Zheng

declare -i a
a=$(df | grep "/$" | awk '{print $5}' | cut -d "%" -f 1)
if [ $a -lt 80 ]; then #条件判断语句在后面内容中会讲到
echo "Storage space normal" #如果a小于80
else
echo "Warning:Not enough storage space" #如果a大于80
fi
echo -e "root storage used $a%"

示例2:应用多分支语句判断变量值的范围(仅作为多分支测试使用)

#!/bin/bash

#Author: Zheng

read -p "Input a: " a
if [ $a -lt 30 ]; then
echo "a<30"
elif [ $a -lt 80 ]; then
echo "30<=a<80"
else
echo "a>=80"
fi

case 判断语句

 简介

  同样作为分支顺序语句,case与if存在一定差别。case语句只能判断一种条件的不同关系,而if语句可以判断多种条件关系。但在一种条件的不同关系判断中,case语句更加简单,一般用于多项选择(仅适用于字符串匹配),支持通配符

 基本语法

case $变量名 in
"值1") #变量值为值1
动作1
;;
"值2" | "值3") #变量值为值2或值3
动作2
;;
...
*)
其余所有值,执行动作n
;;
esac

 注意

  • 语句的结束标志是将头部关键字倒序
  • 值可以是通配符,当值为通配符时,不可以加转义的
    ""
    ,否则将
    *
    当作普通字符处理
  • case条件支持正则表达式中的任意字符
    []
  • 当两个条件为或时,可以用
    |
    连接,当两条件有一个成立时改条即成立

 基本用法示例

#此示例读取一个成绩评级,并对各个评级作出回应
#!/bin/bash

#Author:Zheng

read -p "Please input your Grade(A\B\C\D):" -t 30 s
case $s in
A)
echo -e "Your grade is A!\nYou are excellent! Congratulations!"
;;
B | C)
echo -e "Good,\nplease keep it up!"
;;
D)
echo -e "You have failed this exam!\nStill have to work hard!"
;;
*)
echo -e "Grade error!\nPlease input A\\B\\C\\D"
esac

 拓展用法

  • 在基本用法中,如果变量符合一个条件,就会跳入执行对应动作,动作执行完毕直接跳出,而不会继续匹配剩余条件

  • 使用

    ;&
    代替
    ;;
    结束一个动作
    可以不跳出case语句,无论后面条件是否匹配,一律执行,直到出现
    ;;

    例如,这个示例中使用

    ;&
    号,匹配到了第一个条件,但执行了两个
    echo
    命令

#!/bin/bash

#Author:Zheng

t="AB"
case $t in
A*)
echo "A*"
;&
*A) #实际上没有匹配
echo "*B"
;&
esac
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: