linux-case
阿新 • • 發佈:2019-01-02
結構
case param in
value1)
statement1
...
;;
value2)
statement2
...
;;
...)
...
;;
esac
head
:case param in
統一模式的頭,param
為變數名match
:value
,分支選擇標記statement
:具體操作語句,不限數量tail
:;;
,分支操作結束標記,不用break
,自動跳出over
:esac
,case
反拼
特殊
- 對比
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
中的value
和switch
的最大區別,並不是結構上的差異,而在於匹配的方式不同。
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