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

Shell 9

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
Logo

更多推荐