Shell教程—模式匹配case

case 语句和 if...elif...else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。

case语句的语法结构:

case 变量  in
condition1)
   command....
   ;;
condition2)
   command....
   ;;
condition3)
   command....
   ;;
*)
   #无匹配条件后的命令序列
esac   

case语句应该注意一下几点:

  • case 语句会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程,之后就不会在往下走;如果数值不符,则依次比较下一个值;如果所有的值都不符合,则执行*)(*代表所有其他值)中的程序。
  • case 语句以case开头,以esac结尾。
  • 在每个分支程序之后要以;;(双分号)结尾,代表该程序段结束(千万不要忘记)。
案例1:模式匹配用户输入选择

在我们的脚本中经常有让用户输入Y/N表示是否确定执行接下来的操作,这个用if-else也可以做,但是当考虑到多个判断条件的时候if写出来的语句就显得过于繁杂,用case语句就可以简化

#!/bin/bash

read -p "Plead input a username: " username

id $username &>/dev/null
if [ "$?" -ne 0 ]; then
   echo "$username: no such user"
   exit 1
fi


read -p "Are you sure to delete $username?[Y/N] " choice
case "$choice" in 
y|Y|yes|YES)
  userdel "$username"
  echo "$username is deleted!"
  ;;
*)
  echo "Noting to do!"
  ;;
esac  

#对比if的写法,判断条件十分的繁杂,稍有不慎就可能写错
#if [ -n "$choice" -a "$choice" = "y" -o "$choice" = "Y" -o "$choice" = "yes" -o "$choice" = "YES" ]; then
#    userdel $username
#    echo "$username id deleted!"
#else
#  echo "error input"
#  exit  
#fi  
案例二:实现一个简单的系统管理工具

执行脚本,首先打印支持的工具和代号,然后用户输入工具的代号执行功能。

#!/bin/bash

#定义个菜单
menu() {
  printf "\t%s\t%s\n" "h." "help"
  printf "\t%s\t%s\n" "f." "disk partition"
  printf "\t%s\t%s\n" "d." "filesystem mount"
  printf "\t%s\t%s\n" "m." "memory"
  printf "\t%s\t%s\n" "u." "system load time"
  printf "\t%s\t%s\n" "q." "exit"
}

#执行脚本首先打印菜单
menu

while :
do

  read -p "Please input choice[h for help]: " choice
  case $choice in
  h)
      clear
      menu
      ;; 
  f)
      fdisk -l   
      ;;
  d)
      df -Th
      ;;
  m)
      free -m
      ;;
  u)
      uptime
      ;;
  q)
      echo "Bye!"
      exit 0
      ;;
  "")
      ;; 
  *)
      echo "ERROR INPUT!"
      ;;
  esac
done 

留言区

还能输入500个字符