Ecco la mia opinione su questo.
Preferirei non usare un bash per loop se posso evitarlo, poiché ciò richiede tempo per l'esecuzione. Se qualcosa deve essere ripetuto, lascia che sia qualcosa che è stato scritto in un linguaggio di livello inferiore rispetto a uno script di shell.
function array_contains { # arrayname value
local -A _arr=()
local IFS=
eval _arr=( $(eval printf '[%q]="1"\ ' "\${$1[@]}") )
return $(( 1 - 0${_arr[$2]} ))
}
Funziona creando una matrice associativa temporanea _arr
, i cui indici sono derivati dai valori della matrice di input. (Si noti che le matrici associative sono disponibili nella bash 4 e successive, quindi questa funzione non funzionerà nelle versioni precedenti di bash.) Impostiamo $IFS
per evitare la divisione delle parole negli spazi bianchi.
La funzione non contiene loop espliciti, sebbene internamente passi attraverso l'array di input per popolare printf
. Il formato printf utilizza %q
per garantire la fuga dei dati di input in modo che possano essere tranquillamente utilizzati come chiavi dell'array.
$ a=("one two" three four)
$ array_contains a three && echo BOOYA
BOOYA
$ array_contains a two && echo FAIL
$
Si noti che tutto ciò che questa funzione utilizza è incorporato per bash, quindi non ci sono pipe esterne che ti trascinano verso il basso, anche nell'espansione del comando.
E se non ti piace usare eval
... beh, sei libero di usare un altro approccio. :-)