Pingfan's Blog

linux bash——详解case关键字

字数统计: 481阅读时长: 2 min
2019/05/26 Share

通用语法

case语句相当于其他语言的switch,如果if对同一个变量要判断很多种情况,可以用case语句来写。

通用语法如下:

case "$VAR" in 
    pattern_1)
        # Commands go here.
           ;;
    pattern_N)
        # Commands go here.
        ;;
esac
  • 双分号;;表示终止case语句执行。类似于其他编程语言的break关键字。

例如对于ssh startssh stop:

case "$1" in
    start)   # 如果是start则启动ssh
        /usr/sbin/sshd
        ;;
    stop)   # 如果是stop则关掉ssh进程
        kill $(cat /var/run/sshd.pid)
        ;;
esac

default分支

对于其他语言,switch有default分支,bash也不例外,可以使用*进行匹配:

case "$1" in
    start)   # 如果是start则启动ssh
        /usr/sbin/sshd
        ;;
    stop)   # 如果是stop则关掉ssh进程
        kill $(cat /var/run/sshd.pid)
        ;;
    *)
        echo "Usage: $0 start|stop"; exit 1
        ;;
esac

匹配大小写

上面的例子只能匹配小写的输入,例如输入大写的START,此时就不能匹配。

如果想匹配大小写,一种简单的实现方式:

case "$1" in
    start|START)   # 使用|来表示匹配多种情况
        /usr/sbin/sshd
        ;;
    stop|STOP)   
        kill $(cat /var/run/sshd.pid)
        ;;
    *)
        echo "Usage: $0 start|stop"; exit 1
        ;;
esac

我们在安装软件时,提示输入yes或no表示我们的选择。此时输入y,yes, YeS都可以。这又是怎么实现的呢?

read -p "Enter y or n: " ANSWER
case "$ANSWER" in
    [yY]|[yY][eE][sS])
        echo "You answered yes."
        ;;
    [nN]|[nN][oO])
        echo "You answered no."
        ;;
    *)
        echo "Invalid answer!"
        ;;
esac

运行效果如下:

[@bogon:bashlearn (master)]$ ./1.sh
Enter y or n: yes
You answered yes.
[@bogon:bashlearn (master)]$ ./1.sh
Enter y or n: Yes
You answered yes.
[@bogon:bashlearn (master)]$ ./1.sh
Enter y or n: jjj
Invalid answer!
[@bogon:bashlearn (master)]$ ./1.sh
Enter y or n: No
You answered no.

还有一种实现思路,只检测首字母,不关心后面的部分,实现如下:

read -p "Enter y or n: " ANSWER
case "$ANSWER" in
    [yY]*)
        echo "You answered yes."
        ;;
    [nN]*)
        echo "You answered no."
        ;;
    *)
        echo "Invalid answer!"
        ;;
esac
CATALOG
  1. 1. 通用语法
  2. 2. default分支
  3. 3. 匹配大小写