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