当前位置: 首页 > 工具软件 > Casein > 使用案例 >

Shell case in简要说明与使用

祁俊喆
2023-12-01

case 结构条件句语法


case “字符串变量” in

值 1)指令....
;;
值 2)指令...
;;
*)指令...
esac
范例 1:根据用户的输入判断是哪个数字
[root@localhost ~]# cat case-1.sh
#!/bin/bash
read -p "Please input a number" ans
case "$ans" in
1)
echo "the num you input is 1"
;;
2)
echo "the num you input is 2"
;;
[3-9])
echo "the num you input is $ans"
;;
*)
echo "the num you input must be less 9."
exit
;;
esac
if 语句的实现:
[root@localhost ~]# cat case-if.sh
#!/bin/bash
read -p "Please input a number" ans
if [ $ans -eq 1 ];then
echo "the num you input is 1"
elif [ $ans -eq 2 ];then
echo "the num you input is 2"
elif [ $ans -ge 3 -a $ans -le 9 ];then
echo "the num you input is $ans"
else
echo "the num you input must be less 9."
exit
fi

范例 2:根据用户的选择输入判断是哪种水果并加上不同颜色

[root@localhost ~]# cat case-2.sh
#!/bin/sh
#color defined
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
RES='\E[0m'
read -p "Please input the fruit name you like :" ans
case "$ans" in
apple|APPLE)
echo -e "the frult name you like is ${RED_COLOR}"$ans."${RES}"
;;
banana|BANANA)
echo -e "the frult name you like is ${YELLOW_COLOR}"$ans."${RES}"
;;
pear|PEAR)
echo -e "the frult name you like is ${GREEN_COLOR}"$ans."${RES}"
;;
*)
echo -e "Here is not the fruit name you
like--${BLUE_COLOR}"$ans."${RES}"
exit
;;
esac

 

和其它编程语言类似,Shell 也支持两种分支结构(选择结构),分别是 if else 语句和 case in 语句。当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了。

[root@localhost ~]# cat case.sh 
#!/bin/bash
read num

case $num in
aix)
	echo "aix"
	;;
unix)
	echo "unix"
	;;
linux)
	echo "linux"
	;;
hp)
	echo "hp"
	;;
*)
	echo "not match"
esac

[root@localhost ~]# ./case.sh 
hp
hp
[root@localhost ~]# ./case.sh 
aix
aix
[root@localhost ~]# ./case.sh 
test
not match



#!/bin/bash
printf "Input integer number: "
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 "error"
esac

看了这个例子,相信大家对 case in 语句有了一个大体上的认识,那么,接下来我们就正式开始讲解 case in 的用法,它的基本格式如下:

case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        statement2
        ;;
    pattern3)
        statement3
        ;;
    ……
    *)
        statementn
esac

case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式。

  • expression 既可以是一个变量、一个数字、一个字符串还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。
    os400=false
    case "`uname`" in
    OS400*) os400=true;;
    esac
  • pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。

case 会将 expression  的值与 pattern1、pattern2、pattern3 逐个进行匹配:

  • 如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。
  • 如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句(*表示其它所有值),直到遇见双分号;;或者esac才结束。*)相当于多个 if 分支语句中最后的 else 部分。
如果你有C语言、 C++Java 等编程经验,这里的 ;;*)就相当于其它编程语言中的 break 和 default。

*)的几点说明:

  • Shell case in 语句中的*)用来“托底”,万一 expression 没有匹配到任何一个模式,*)部分可以做一些“善后”工作,或者给用户一些提示。
  • 可以没有*)部分。如果 expression 没有匹配到任何一个模式,那么就不执行任何操作。

除最后一个分支外(这个分支可以是普通分支,也可以是*)分支),其它的每个分支都必须以;;结尾,;;代表一个分支的结束,不写的话会有语法错误。最后一个分支可以写;;,也可以不写,因为无论如何,执行到 esac 都会结束整个 case in 语句。

上面的代码是 case in 最常见的用法,即 expression 部分是一个变量,pattern 部分是一个数字或者表达式。

case in 和正则表达式


case in 的 pattern 部分支持简单的正则表达式,具体来说,可以使用以下几种格式:

格式说明
*表示任意字符串。
[abc]表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。
[m-n]表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。
|表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。

如果不加以说明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的方式来匹配的;本节第二段代码看起来是判断数字是否相等,其实是判断字符串是否相等

最后一个分支*)并不是什么语法规定,它只是一个正则表达式,*表示任意字符串,所以不管 expression 的值是什么,*)总能匹配成功 ,下面的例子演示了如何在 case in 中使用正则表达式:

[root@localhost ~]# cat case.sh 
#!/bin/bash

read num

case $num in
[a-zA-Z])
	echo "[a-zA-Z]"
	;;
[1-9])
	echo "[1-9]"
	;;
[,.?])
	echo "[,.?]"
	;;
*)
	echo "not match"
esac

[root@localhost ~]# ./case.sh 
,
[,.?]
[root@localhost ~]# ./case.sh 
a
[a-zA-Z]
[root@localhost ~]# ./case.sh 
1
[1-9]
[root@localhost ~]# ./case.sh 
ggg
not match
 类似资料: