可以在一個 case 語句中符合多個條件嗎?

可以在一個 case 語句中符合多個條件嗎?

我想做這樣的事情,在周五,輸出是匹配的兩個條件:

#!/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

相關內容