Ich suche einen "in" -Operator, der ungefähr so funktioniert:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Dies ist offensichtlich eine viel kürzere Aussage als beispielsweise die Verwendung mehrerer "oder" Tests.
bash
shell-script
bourne-shell
mrjayviper
quelle
quelle
=~
ist im POSIX-Einzelklammertest nicht gültig[
ist POSIX, ist aber[[
ein erweitertes Feature von bash, ksh (anscheinend stammt es von dort, und zsh.case
Beispiel ist das meiste POSIX von allencase "$1" in
muss nicht in Anführungszeichen gesetzt werden. In diesem Token wird weder eine Wortteilung noch eine Pfadnamenerweiterung durchgeführt.Es gibt keinen "in" -Test in bash, aber einen Regex-Test (nicht in bourne):
Und normalerweise mit einer Variablen geschrieben (weniger Probleme mit Zitieren):
Für eine ältere Bourne-Shell müssen Sie eine Groß- / Kleinschreibung verwenden:
quelle
Die Verwendung von a
case
ist in Ordnung und gut, wenn Sie eine feste Anzahl von Haustieren haben, mit denen Sie übereinstimmen möchten. Es wird jedoch nicht funktionieren, wenn Sie das Muster zur Laufzeit erstellen müssen, dacase
die Abwechslung nicht in erweiterten Parametern interpretiert wird.Dies wird nur mit der Literalzeichenfolge übereinstimmen
cat|dog|mouse
:Sie können jedoch eine Variable mit dem regulären Ausdruck match verwenden. Solange die Variable nicht in Anführungszeichen gesetzt ist, haben alle Regex-Operatoren in ihr ihre spezielle Bedeutung.
Sie können auch assoziative Arrays verwenden. Die Prüfung, ob ein Schlüssel in einem Schlüssel vorhanden ist, kommt dem von
in
Bash angegebenen Operator am nächsten . Die Syntax ist allerdings etwas hässlich:(
${arr[$1]+x}
Erweitert umx
wennarr[$1]
gesetzt, sonst leer. )quelle
Sie könnten eine
case
Anweisung in einemif
Test verwenden, aber der Code würde ein bisschen haarig aussehen:oder etwas kürzer,
Hierbei wird eine
case
Klausel verwendet, um nur den Mustervergleich für dieif
Klausel durchzuführen. Es wird ein unnötiger Wahr / Falsch-Test eingeführt.Es ist besser, nur zu verwenden
case
:Mach das nicht:
oder dieses:
... weil Sie nur eine gefährlichere Cruft hinzufügen, nur um eine
if
Anweisung in Ihrem Code anstelle einer absolut vernünftigencase
Anweisung verwenden zu können.quelle
eval
dercase
Anweisungen ausführen, und es wäre noch fehleranfälliger."$1"|"$2"|"$3"
. Auch unix.stackexchange.com/a/234415/85039 Aber ja, es ist ein bisschen haarig.grep
Ansatz.-q
um jegliche Ausgabe auf dem Bildschirm zu vermeiden (schneller zu tippen als>/dev/null
).-E
für erweiterte reguläre Ausdrücke(cat|dog|mouse)
benötigt aspekte dies.^(cat|dog|mouse)$
Stimmt mit Zeilen überein, die^
mit Katze, Hund oder Maus beginnen ((cat|dog|mouse)
), gefolgt von Zeilenende ($
)quelle