
我想做這樣的事情,在周五,輸出是匹配的兩個條件:
#!/bin/bash
#!/bin/bash
NOW=$(date +"%a")
case $NOW in
Mon)
echo "Mon";;
Tue|Wed|Thu|Fri)
echo "Tue|Wed|Thu|Fri";;
Fri|Sat|Sun)
echo "Fri|Sat|Sun";;
*) ;;
esac
正如上面的程式碼所寫,週五的唯一輸出將是:
週二|週三|週四|週五
週五期望產出:
週二|週三|週四|週五 週五
|週六|週日
我的理解是,在正常情況下,僅對應於第一個模式的命令與表達式相符的內容將會被執行。
有沒有辦法執行其他匹配模式的命令?
編輯:我不是尋找跌倒行為,但這也是一件值得了解的事。謝謝鋼鐵司機。
答案1
您可以使用;;&
連接詞。從man bash
:
Using ;;& in place of ;; causes the shell to test the next pattern list in the statement, if any, and execute any associated list on a successful match.
前任。給定
$ cat myscript
#!/bin/bash
NOW=$(date -d "$1" +"%a")
case $NOW in
Mon)
echo "Mon";;
Tue|Wed|Thu|Fri)
echo "Tue|Wed|Thu|Fri";;&
Fri|Sat|Sun)
echo "Fri|Sat|Sun";;
*) ;;
esac
然後
$ ./myscript thursday
Tue|Wed|Thu|Fri
$ ./myscript friday
Tue|Wed|Thu|Fri
Fri|Sat|Sun
$ ./myscript saturday
Fri|Sat|Sun
有關詳細資訊(包括其他 shell 中的等效資訊),請參閱
答案2
不,case 語句的基本結構是只執行一個符合的段。除了你拒絕的失敗之外。此外,它僅適用於某些 shell,而不是所有 shell,並且具有特定於每個 shell 的語法。失敗的 Bash 語法是;;&
。在 ksh 或 zsh 中,唯一可用的;&
不執行下一個測試,僅直接執行該段(將列印 中所有情況的兩行Tue|Wed|Thu|Fri
)。
case 的唯一選擇是將其分割為以下兩行:
esac
case $now in
像這樣(請!請保留環境變數的大寫變數):
#!/bin/bash
now=$(date +"%a")
case $now in
Mon)
echo "Mon";;
Tue|Wed|Thu|Fri)
echo "Tue|Wed|Thu|Fri";;
esac
case $now in
Fri|Sat|Sun)
echo "Fri|Sat|Sun";;
*) ;;
esac
答案3
另一種選擇:使用函數。
$ cat tt
#!/bin/bash
mon() { echo " Mon" ; }
tue_fri() { echo " Tue|Wed|Thu|Fri" ; }
fri_sun() { echo " Fri|Sat|Sun" ; }
now=$(date +"%a")
[[ $1 != "" ]] && now=$1 # use for testing
case $now in
Mon) mon ;;
Tue|Wed|Thu) tue_fri ;;
Fri) tue_fri; fri_sun ;;
Sat|Sun) fri_sun ;;
*) echo " ERROR" ;;
esac
並測試
$ for f in Mon Tue Wed Thu Fri Sat Sun bla ;do echo "$f"; tt "$f"; done
Mon
Mon
Tue
Tue|Wed|Thu|Fri
Wed
Tue|Wed|Thu|Fri
Thu
Tue|Wed|Thu|Fri
Fri
Tue|Wed|Thu|Fri
Fri|Sat|Sun
Sat
Fri|Sat|Sun
Sun
Fri|Sat|Sun
bla
ERROR