Shell—— 21.case

语法:
case word in
[ [(] pattern [| pattern]…)
command-list ;;]

esac
sysV风格的服务启动脚本是shell脚本中使用case语句最典型案例。例如:

case "$1" in
    start)
        start;;
    stop)
        stop;;
    restart)
        restart;;
    reload | force-reload)
        reload;;
    status)
        status;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}"
        exit 2
esac

从上面的示例中,可以看出一些结论:
(1).case中的每个小分句都以双分号";;“结尾,但最后一个小分句的双分号可以省略。实际上,小分句除了使用”;;“结尾,还可以使用”;&“和”;;&“结尾,只不过意义不同,它们用的不多,不过为了文章完整性,稍后还是给出说明。
(2).每个小分句中的pattern部分都使用括号”()“包围,只不过左括号”(“不是必须的。
(3).每个小分句的pattern支持通配符模式匹配(不是正则匹配模式,因此只有3种通配元字符:”"、"?“和[…]),其中使用”|“分隔多个通配符pattern,表示满足其中一个pattern即可。例如”([yY] | [yY][eE][sS]])"表示即可以输入单个字母的y或Y,还可以输入yes三个字母的任意大小写格式。
set – y;case “$1” in ([yY]|[yY][eE][sS]) echo right;😭
) echo wrong;;esac
其中"set – string_list"的作用是将输入的string_list按照IFS分隔后分别赋值给位置变量$1、$2、$3…,因此此处是为$1赋值字符"y"。
(4).最后一个小分句使用的pattern是"",表示无法匹配前面所有小分句时,将匹配该小分句。一般最后一个小分句都会使用"“避免case语句无法匹配的情况,在shell脚本中,此小分句一般用于提示用户脚本的使用方法,即给出脚本的Usage。
(5).附加一个结论:如果任何模式都不匹配,该命令的返回状态是零;否则,返回最后一个被执行的命令的返回值。
如果小分句不是使用双分号”;;“结尾,而是使用”;&“或”;;&"结尾,则case语句的行为将改变。
";;"结尾符号表示小分句执行完成后立即退出case语句。
";&"表示继续执行下一个小分句中的command部分,而无需进行匹配动作,并由此小分句的结尾符号来决定是否继续操作下一个小分句。
";;&"表示继续向后(不止是下一个,而是一直向后)匹配小分句,如果匹配成功,则执行对应小分句中的command部分,并由此小分句的结尾符号来决定是否继续向后匹配。

set -- y
case "$1" in
    ([yY]|[yY][eE][sS])
        echo yes;&
    ([nN]|[nN][oO])
        echo no;;
    (*)
        echo wrong;;
esac
yes
no

在此示例中,$1能匹配第一个小分句,但第一个小分句的结尾符号为";&",所以无需判断地直接执行第二个小分句的"echo no",但第二个小分句的结尾符号为";;",于是直接退出case语句。因此,即使$1无法匹配第二个小分句,case语句的结果中也输出了"yes"和"no"。

set -- y
case "$1" in
    ([yY]|[yY][eE][sS])
        echo yes;;&
    ([nN]|[nN][oO])
        echo no;;
    (*)
        echo wrong;;
esac
yes
wrong

在此示例中,$1能匹配第一个小分句,但第一个小分句的结尾符号为";;&",所以继续向下匹配,第二个小分句未匹配成功,直到第三个小分句才被匹配上,于是执行第三个小分句中的"echo wrong",但第三个小分句的结尾符号为";;",于是直接退出case语句。所以,结果中输出了"yes"和"wrong"。

————Blueicex 2020/03/18 19:56 blueice1980@126.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值