Verwenden von:
set -o nounset
Mit einem indizierten Array wie:
myArray=( "red" "black" "blue" )
Was ist der kürzeste Weg, um zu überprüfen, ob Element 1 gesetzt ist?
Ich benutze manchmal Folgendes:test "${#myArray[@]}" -gt "1" && echo "1 exists" || echo "1 doesn't exist"
Ich würde gerne wissen, ob es eine bevorzugte gibt.
Wie gehe ich mit nicht aufeinanderfolgenden Indizes um?
myArray=() myArray[12]="red" myArray[51]="black" myArray[129]="blue"
Wie kann man schnell überprüfen, ob das
51
zum Beispiel schon eingestellt ist?Wie gehe ich mit assoziativen Arrays um?
declare -A myArray myArray["key1"]="red" myArray["key2"]="black" myArray["key3"]="blue"
Wie kann man schnell überprüfen, ob dies
key2
beispielsweise bereits verwendet wird?
+abc
,[ ${array[key]} ]
wird falsch beurteilen , wenn das Element in der Tat gesetzt ist , aber auf einen leeren Wert, so dass es die Prüfung tatsächlich den Wert Nicht-Leere anstatt die Schlüssel Existenz.+abc
auch fehlgeschlagen, wennarray[key]
nicht gesetzt undset -u
wirksam ist.Von Man Bash , bedingte Ausdrücke:
Beispiel:
Dies zeigt, dass sowohl foo [bar] als auch foo [baz] gesetzt sind (obwohl letzterer auf einen leeren Wert gesetzt ist) und foo [quux] nicht.
quelle
set -u
, warum[[ -v "${foo[bar]}" ]]
ein ungebundenen Variable Fehler erzeugen , wennbar
nicht im Wörterbuch vorhanden? Funktioniert gut ohne die${}
; Ich bin es einfach gewohnt, es standardmäßig für alles zu verwenden."${foo[bar]}"
wertet zuerst die Array-Variable aus, daher[[ -v
testet der Befehl nach einer Variablen mit dem Namen dieses WertsNeue Antwort
Ab Version 4.2 von Bash(und neuer) gibt es eine neue
-v
Option für den eingebautentest
Befehl.Dies funktioniert mit assoziativen Arrays auf die gleiche Weise:
Mit einem kleinen Unterschied:
In regulären Arrays ist die Variable zwischen Klammern (
[i]
) eine Ganzzahl, daher ist das Dollarsymbol ($
) nicht erforderlich, aber für ein assoziatives Array ist als Schlüssel ein Wort$
erforderlich ([$i]
)!Alte Antwort für Bash vor V4.2
Leider gibt Bash keine Möglichkeit, einen Unterschied zwischen leeren und undefinierten Variablen zu machen.
Es gibt jedoch einige Möglichkeiten:
(keine Antwort geben)
Und für assoziative Arrays können Sie dasselbe verwenden:
Sie könnten die Arbeit ohne externe Tools erledigen (kein printf | grep als reine Bash ), und warum nicht, checkIfExist () als neue Bash-Funktion erstellen :
oder erstellen Sie sogar eine neue getIfExist- Bash-Funktion, die den gewünschten Wert zurückgibt und mit falschem Ergebniscode beendet wird, wenn der gewünschte Wert nicht vorhanden ist:
quelle
bash 4.2.46
. Funktioniert weiterbash 4.4.12
.-v
Optiontest
odergetIfExist
Funktion?-v
funktioniert nicht auf Arrays unter meinem CentOS 7.7.1908 mit Bash 4.2.46. Der Code aus Ihrem ersten Codeblock wirdnot exist
in allen Fällen unter dieser Bash gedruckt . (Auch versucht[$i]
statt[i]
, kein Unterschied)getestet in Bash 4.3.39 (1) -Release
quelle
+
Um dieses Problem zu umgehen, können Sie die Parametererweiterung verwenden, um einen leeren Wert durch einen Platzhalter wie einen Unterstrich zu ersetzen. Zum Beispieldeclare -A a[x]=;[[ ${a[x]} ]];echo $?
druckt1
, aberdeclare -A a[x]=;[[ ${a[x]+_} ]];echo $?
druckt0
.Was ist mit einem
-z
Test und dem:-
Bediener?Zum Beispiel dieses Skript:
Drucke:
quelle
Dies ist der einfachste Weg, den ich für Skripte gefunden habe.
<search>
ist die Zeichenfolge, die Sie suchen möchten,ASSOC_ARRAY
der Name der Variablen, die Ihr assoziatives Array enthält.Abhängig davon, was Sie erreichen möchten:
Schlüssel existiert :
Schlüssel existiert nicht :
Wert existiert :
Wert existiert nicht :
quelle
Ich habe eine Funktion geschrieben, um zu überprüfen, ob ein Schlüssel in einem Array in Bash vorhanden ist:
Beispiel
Getestet mit GNU Bash, Version 4.1.5 (1) -Veröffentlichung (i486-pc-linux-gnu)
quelle