Hilfe für ein einfaches Skript
#!/bin/bash
array1=(
prova1
prova2
slack64
)
a="slack64"
b="ab"
if [ $a = $b ]
then
echo "$a = $b : a is equal to b"
else
echo "$a = $b: a is not equal to b"
fi
Dieses Skript funktioniert einfach nicht. Ich möchte ein Skript, das prüft, ob slack64 in einer Liste vorhanden ist (ich verwende ein Array), und mir einfach sagt, ob yes vorhanden ist oder nein. Ich weiß nicht, wie man ein Array mit einer einzelnen Variablen vergleicht.
array1
arbeitAntworten:
Verwenden Sie eine andere Art von Array: Verwenden Sie anstelle eines ganzzahligen Arrays ein assoziatives Array, damit der Schlüssel (Index) das ist, nach dem Sie suchen.
bash-4.0
oder später wird dafür benötigt.Im obigen Beispiel kümmern wir uns nicht wirklich um die Werte, sie müssen dafür nur nicht leer sein. Sie können ein indiziertes Array in ein neues assoziatives Array "invertieren", indem Sie den Schlüssel und den Wert austauschen:
Dies kann sich auszahlen, wenn Sie große Arrays haben, die häufig durchsucht werden, da die Implementierung von assoziativen Arrays eine bessere Leistung erzielt als Array-Traversing-Schleifen. Es ist jedoch nicht für jeden Anwendungsfall geeignet, da es keine Duplikate verarbeiten kann (obwohl Sie den Wert anstelle von nur 1 wie oben als Zähler verwenden können) und keinen leeren Index verarbeiten kann.
Brechen Sie die komplexe Linie oben aus, um die "Inversion" zu erklären:
quelle
Der einfache Weg ist, mit einer Schleife zu iterieren:
quelle
[[ a == aaa ]]
ist falsch aber eine Übereinstimmung aaa nein?[ ]
: Zeichenklasse (Globs)[[ ]]
für das, was Sie gesagt haben. Hast du getestet?Mit
zsh
:quelle
Diese Funktion arbeitet mit assoziativen Arrays.
Mit dieser Funktion können wir eine der folgenden Aktionen ausführen:
- überprüfe ob das Array einen bestimmten Schlüssel hat -----------------> inArray "myKey" $ {! myArray [@]} "
- überprüfe, ob das Array einen bestimmten Wert enthält ---------> inArray "myValue" "$ {myArray [@]}"
quelle
Sie können dafür auch grep verwenden:
quelle
$a
, und beginnen Sie nicht damit, dass-
Sie das vergessen haben--
). Sie könnten%s\0
anstelle von%s\n
und verwendengrep --null
(vorausgesetzt, GNU grep oder compatible), da bash-Variablen das NUL-Zeichen ohnehin nicht enthalten können. Sie müssten auch speziell den Fall eines leeren Arrays behandeln (da dieser Befehl printf dasselbe ausgibt wie für ein Array mit einem leeren Element). Beachten Sie auch, dass Sie hier keine Subshell starten müssen.