case语句

通用语法

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.