Gibt es in der Shell eine Kontrollstruktur analog case für Mehrfachauswahl?
Bekanntlich handelt es sich bei »case« um einen Schalter, mit dem man einen einfachen Wert abfragen kann, ohne jeweils die etwas unübersichtlichere »if ... elif ... else«-Sequenz verwenden zu müssen. Aber gibt es solch eine Möglichkeit auch für Mehrfachauswahl, und ich habe sie bisher nur noch nicht entdeckt?
Um das ein wenig zu veranschaulichen, habe ich ein Beispielskript geschrieben: in den Kommentaren ist enthalten, wie ich mir die Struktur in etwa vorstelle, die if-Abfrage würde dann entsprechend entfallen:
#!/bin/bash
wahl=$1
# multi-case $wahl in
# a)
if fgrep -q 'a' <<< $wahl; then
echo 'Die erste Befehls-Sequenz wird ausgeführt.'
fi
# b)
if fgrep -q 'b' <<< $wahl; then
echo 'Die zweite Befehls-Sequenz wird ausgeführt.'
fi
# c)
if fgrep -q 'c' <<< $wahl; then
echo 'Die dritte Befehls-Sequenz wird ausgeführt.'
fi
# d)
if fgrep -q 'd' <<< $wahl; then
echo 'Die vierte Befehls-Sequenz wird ausgeführt.'
fi
# e)
if fgrep -q 'e' <<< $wahl; then
echo 'Die fünfte Befehls-Sequenz wird ausgeführt.'
fi
# esac-itlum
In der Ausführung:
x@yz:~$ ./mehrfachauswahl.sh bd
Die zweite Befehls-Sequenz wird ausgeführt.
Die vierte Befehls-Sequenz wird ausgeführt.
x@yz:~$
1 Antwort
Du kannst über den Input iterieren.
- Eingabe in einzelne Buchstaben unterteilen -> Abspeichern als array
- Schleife über den array -> case-Abfrage
Falls ich dein Problem richtig erfasst habe.
Schwieriger wird es, wenn es verschieden ist, ob es a und dann b bspw ist. Das kann man vielleicht über "Fall 1 UND Fall 2" lösen.
Aha. Ja, da ist der Fall etwas komplexer, aber ich sehe nicht unbedingt einen Grund, warum das nicht auch so geht.
Vielleicht teilst du die eine Zelle mit beiden Schaltern auch einfach auf in zwei Zellen?
Ich weiß nicht, ob es ein "Quasi-case" nicht doch gibt, aber mir ist es nicht bekannt.
Was aber vielleicht für deinen Fall interessant ist: eine Funktion, die das übernimmt? Also Case1 in jeder Option -> Funktion -> Case2
Aber dafür kenne ich deinen konkreten Fall zu wenig und mehr darfst du aus Datenschutz vmtl nicht rausgeben xD
Vielleicht geht das auch in Python einfacher? Ich kann aber kein Python. Nur etwas Bash, C++ und Rust :P
So, wie ich den Fall in der Frage beschrieben habe, lässt sich das in der Tat ganz gut über einen Array lösen. In der Praxis lese ich die Daten aber bereits über eine csv-Datei ein und wandele jede Zeile dieser Datei in einen Array um. Bei der Pflege der csv-Datei in LO Calc überlege ich, welche Befehlssequenzen ich für den jeweiligen Datensatz brauche und trage die entsprechende Buchstabenkombination in die passende Zelle ein.
Dieses Array-Feld nochmals in einen (Unter-)Array abzubilden und in eine Schleife einzubinden, wird mir dann, glaube ich, etwas zu kompliziert. Dann bleibe ich doch lieber bei der klassischen if-Verzweigung.
Es war eigentlich auch nur so eine Überlegung, ob es für solche Fälle ein »Quasi-case« gibt. Da dies anscheinend nicht der Fall ist, kann ich auch ganz gut ohne leben. ;-)