Können mehrere Bedingungen in einer Case-Anweisung erfüllt werden?

Können mehrere Bedingungen in einer Case-Anweisung erfüllt werden?

Ich möchte so etwas machen, dass am Freitag die Ausgabe für beide Bedingungen gilt:

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

So wie der obige Code geschrieben ist, wäre die einzige Ausgabe am Freitag:

Di|Mi|Do|Fr

Gewünschte Ausgabe am Freitag:

Di|Mi|Do|Fr Fr
|Sa|So

Ich verstehe, dass normalerweisenur die Befehle, die dem ersten Muster entsprechendie dem Ausdruck entsprechen, werden ausgeführt.

Gibt es eine Möglichkeit, Befehle für zusätzliche übereinstimmende Muster auszuführen?

EDIT: Ich suche nichtDurchfallverhalten, aber es ist auch gut, das zu wissen. Danke, Steeldriver.

Antwort1

Sie können die Konjunktion verwenden ;;&. Von 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.

Beispiel gegeben

$ 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

Dann

$ ./myscript thursday
Tue|Wed|Thu|Fri

$ ./myscript friday
Tue|Wed|Thu|Fri
Fri|Sat|Sun

$ ./myscript saturday
Fri|Sat|Sun

Weitere Informationen (einschließlich Äquivalente in anderen Shells) finden Sie unter

Antwort2

Nein, die Grundstruktur einer Case-Anweisung besteht darin, dass nur ein passendes Segment ausgeführt wird. Außer bei Fall-Through, das Sie ablehnen. Außerdem funktioniert es nur auf einigen Shells, nicht auf allen, und hat eine für jede Shell spezifische Syntax. Die Bash-Syntax für Fall-Through ist ;;&. In ksh oder zsh führt die einzige verfügbare Anweisung ;&den nächsten Test nicht aus, sondern führt nur das Segment direkt aus (druckt beide Zeilen für alle Fälle in Tue|Wed|Thu|Fri).

Die einzige Möglichkeit besteht darin, die Groß-/Kleinschreibung mit diesen beiden Zeilen aufzuteilen:

esac
case $now in

Wie folgt (Bitte! Behalten Sie bei Umgebungsvariablen GROSSBUCHSTABEN bei):

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

Antwort3

Eine andere Möglichkeit: Verwenden Sie Funktionen.

$ 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

und testen Sie mit

$ 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

verwandte Informationen