1. 程式人生 > >linux-case

linux-case

結構

case param in
value1)
    statement1
    ...
    ;;
value2)
    statement2
    ...
    ;;
...)
    ...
    ;;
esac
  • headcase param in統一模式的頭,param為變數名
  • match : value,分支選擇標記
  • statement:具體操作語句,不限數量
  • tail : ;;,分支操作結束標記,不用break,自動跳出
  • over : esaccase反拼

特殊

  • 對比

case和高階語言中的switch-case沒有太大的區別,具體列舉如下。

position switch case description
頭部 switch case 關鍵字不同
語法不同in
分支 case value case直接通過value選擇分支
操作 statement statement 無區別
分支結束 break ;; switch可以多分支共用同一語句,或者break跳出單獨使用
case;;預設跳出和結束,不用break
預設 default *) 語法標記不同
結束符 } esac switch更多使用{}囊括程式碼塊
case強制esac結束
  • 特色

case中的valueswitch的最大區別,並不是結構上的差異,而在於匹配的方式不同。

switch語句中的match僅僅是單一的值匹配case

更傾向於模式匹配

#!/bin/bash
case $1 in
[0-9])
    echo "number"
    ;;
[a-z])
    echo "lowercase alpha"
    ;;
[A-Z])
    echo "uppercase alpha"
    ;;
*)
    echo "special character"
    ;;
esac

值得注意的是,這種方式並不是正則匹配,它是shell的萬用字元匹配。

#!/bin/bash
case $1 in 
[:alpha:])
    echo "alpha"
    ;;
*)
    echo "other"
    ;;
esac

所以呢,想在指令碼中去進行復雜的模式匹配,先要精修一下萬用字元

不是正則表示式,這點需要記住,別 到時候查錯了手冊就尷尬了。

指令碼

  • 四則
#!/bin/bash
if [ $# -ne 3 ];then
    echo -e "param length error\nexample 1 + 2"
    exit 2
fi
case $2 in
+)
    echo $(($1 + $3))
    ;;
-)
    echo $(($1 - $3))
    ;;
x)
    echo $(($1 * $3))
    ;;
/)
    echo $(($1 / $3))
    ;;
*)
    echo "unknow calc type : $2"
    ;;
esac