Hier ist meine Meinung dazu.
Ich würde lieber keine Bash-for-Schleife verwenden, wenn ich dies vermeiden kann, da die Ausführung einige Zeit in Anspruch nimmt. Wenn sich etwas wiederholen muss, lassen Sie es in einer niedrigeren Sprache als einem Shell-Skript geschrieben sein.
function array_contains { # arrayname value
local -A _arr=()
local IFS=
eval _arr=( $(eval printf '[%q]="1"\ ' "\${$1[@]}") )
return $(( 1 - 0${_arr[$2]} ))
}
Dies funktioniert durch Erstellen eines temporären assoziativen Arrays, _arr
dessen Indizes von den Werten des Eingabearrays abgeleitet werden. (Beachten Sie, dass assoziative Arrays in Bash 4 und höher verfügbar sind, sodass diese Funktion in früheren Versionen von Bash nicht funktioniert.) Wir haben festgelegt $IFS
, dass die Wortaufteilung in Leerzeichen vermieden wird.
Die Funktion enthält keine expliziten Schleifen, obwohl intern Schritte durch das Eingabearray geschlagen werden, um sie zu füllen printf
. Das printf-Format stellt %q
sicher, dass Eingabedaten maskiert werden, sodass sie sicher als Array-Schlüssel verwendet werden können.
$ a=("one two" three four)
$ array_contains a three && echo BOOYA
BOOYA
$ array_contains a two && echo FAIL
$
Beachten Sie, dass alles, was diese Funktion verwendet, ein integriertes Bash ist, sodass Sie auch bei der Befehlserweiterung nicht von externen Pipes nach unten gezogen werden.
Und wenn Sie nicht gerne eval
... nun, Sie können einen anderen Ansatz verwenden. :-)