首页 > 编程笔记 > Linux笔记 阅读:21

Shell case in条件语句的用法(非常详细,附带实例)

在 Shell 程序中,if 语句适合判断条件的数量少且判断条件较为复杂的场景,而当判断条件数量较多且判断条件比较简单时,使用 case in 语句就比较方便了。

if 语句和 case in 语句各自具备优势:
而且 case in 语句主要适用于某个变量存在多种取值,需要对其中的每一种取值分别执行不同操作的场景。

case in 语句的语法格式如下:
case expression in
    pattern1)
        statement1
        ...
        ;;
    pattern2)
        statement1
        ...
        ;;
    pattern3)
        statement1
        ...
        ;;
    *)
        statement1
        ...
esac
case、in 和 esac 是关键字,其中要注意的是开头使用的是 case,结尾用的是 esac。

expression 的格式不固定,可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要可以得到 expression 的值就行。

pattern 表示匹配模式,用于匹配 expression 中的值,它本身可以是一个数字、一个字符串或一个简单的正则表达式。“)”本身是一个关键符号,也是固定不变的。

case in 语句的执行逻辑:case 会将 expression 的值与匹配模式(pattern1~n)进行匹配,匹配顺序是从上到下依次匹配。如果 expression 和某个模式匹配成功,就会执行这个模式后面对应的所有自定义语句,直到遇见双分号“;;”才停止,case in 语句执行完毕。如果 expression 没有匹配到任何一个模式,那么就执行“*)”后面的自定义语句,直到遇见双分号“;;”才结束。“*)”相当于多分支 if 语句中的 else 关键字。

case in 语句可以没有“*)”这部分。如果没有匹配到任何一个模式,那么就不执行任何操作。

如果 expression 没有匹配到任何一个模式,那么“*)”就可以做一些善后的工作,或者给用户一些提示。除最后一个匹配模式外,其他匹配模式必须以双分号“;;”结尾,双分号“;;”表示一个匹配模式的结束,不写会导致 Shell 脚本执行报错。

匹配模式支持部分简单的正则表达式,具体见下表:

表:匹配模式支持的正则表达式
格式 含义
* 表示任意个任意字符串
[abc] 表示 a、b、c 三个字符中的任意一个。例如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个
[m-n] 表示从 m 到 n 的任意一个字符。例如,[0-9] 表示 0~9 之间任意一个数字,[0-9a-zA-Z] 表示任意一个大小写字母或数字
| 表示多重选择,类似逻辑运算中的或运算。例如,abc | xyz 表示匹配字符串“abc”或者“xyz”

大家刚开始接触 case in 语句的格式可能会有些迷茫,毕竟与之前的if判断语句有些差别,这里通过几个案例让大家理解得更深刻一些。

【实例 1】将输入的数字 [1-7] 转换成对应的一周[周一至周日]。
[root@linux opt]# vim demo28.sh
#!/bin/bash

echo "请输入数字[1-7]: "
read num
case $num in
    1)
        echo "Monday"
        ;;
    2)
        echo "Tuesday"
        ;;
    3)
        echo "Wednesday"
        ;;
    4)
        echo "Thursday"
        ;;
    5)
        echo "Friday"
        ;;
    6)
        echo "Saturday"
        ;;
    7)
        echo "Sunday"
        ;;
    *)
        echo "错误,请输入[1-7]之间的数字!"
esac

[root@linux opt]# bash demo28.sh
请输入数字[1-7]:
1
Monday

[root@linux opt]# bash demo28.sh
请输入数字[1-7]:
7
Sunday

[root@linux opt]# bash demo28.sh
请输入数字[1-7]:
5
Friday

[root@linux opt]# bash demo28.sh
请输入数字[1-7]:
99
错误,请输入[1-7]之间的数字!

【实例 2】判断输入的值是大写字母、小写字母、数字或符号中的一种。
[root@linux opt]# vim demo29.sh
#!/bin/bash

echo "请输入一个字符,并按回车键确认:"
read num
case $num in
    [a-z]|[A-Z])
        echo "您输入的是字母"
        ;;
    [0-9])
        echo "您输入的是 1 个数字"
        ;;
    [0-9][0-9])
        echo "您输入的是 2 个数字"
        ;;
    [0-9][0-9][0-9])
        echo "您输入的是 3 个数字"
        ;;
    [,.?!])
        echo "您输入的是符号"
        ;;
    *)
        echo "错误,您输入的值不在匹配范围内!"
esac

[root@linux opt]# bash demo29.sh
请输入 1 个字符,并按回车键确认:
a
您输入的是字母

[root@linux opt]# bash demo29.sh
请输入 1 个字符,并按回车键确认:
H
您输入的是字母

[root@linux opt]# bash demo29.sh
请输入 1 个字符,并按回车键确认:
6
您输入的是一个数字

[root@linux opt]# bash demo29.sh
请输入 1 个字符,并按回车键确认:
234
您输入的是 3 个数字

[root@linux opt]# bash demo29.sh
请输入 1 个字符,并按回车键确认:
.
您输入的是符号

相关文章