shell case

用法:

case expression in

pattern1)     ---------------->值1

     statement1     ----------->表达式

     ;;

pattern2)

     statement2

     ;;

pattern3)

    statement3

    ;;

……

               *)

      statementn

esac

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

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

pattern可以是一个数字,一个字符串,一个正则表达式。

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

如果expression和某个pattern匹配成功,就会执行这个pattern后面对应的所有语句(该语句可以有一条也可以有多条),直到遇到双分号或者esac才停止,然后整个case语句就执行完了,程序会跳出整个case语句,执行esac后面的语句。

如果expression没有匹配到任何一个模式,那么就执行*)后面的语句(*表示其他所有值),直到遇见双分号;;或者esac才结束。*)相当于多个if分支语句中最后的else部分。

*)的几点说明:

·shell case in中的*)用来托底,万一expression没有匹配到任何一个模式,*)可以做一些善后工作,或者给用户一些提示。

·可以没有*)部分。如果expression没有匹配到任何一个模式,那就不执行任何操作。

除最后一个分支外,(这个分支可以是普通分支可以是*)分支),其他的每个分支都必须以;;结尾。

;;代表一个分支的结束,不写的话会有语法错误。最后一个分支可以写;;,也可以不写。因为无论如何,执行到esac都会结束整个case语句。

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

case in和正则表达式

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

如果不加以说明,shell的值都是字符串,expression和pattern也是按照字符串的方式来匹配的,下面代码看起来是判断数字是否相等,其实是判断字符串是否相等。

#!/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

运行结果:

Input integer number:3↙

Wednesday

最后一个分支*)并不是什么语法规定,他只是一个正则表达式,*表示任意字符串,所以不管expression的值是什么,*)总能匹配成功。

例如:

#!/bin/bash

printf "Input a character: "
read -n 1 char

case $char in
    [a-zA-Z])
        printf "\nletter\n"
        ;;
    [0-9])
        printf "\nDigit\n"
        ;;
    [0-9])
        printf "\nDigit\n"
        ;;
    [,.?!])
        printf "\nPunctuation\n"
        ;;
    *)
        printf "\nerror\n"
esac

运行结果1:

Input integer number: S

letter

运行结果2:

Input integer number: ,

Punctuation

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值