Use un tipo diferente de matriz: en lugar de una matriz indexada con enteros, use una matriz asociativa, por lo que la clave (índice) es lo que estará buscando. bash-4.0
o más tarde se requiere para esto.
declare -A array1=(
[prova1]=1 [prova2]=1 [slack64]=1
)
a=slack64
[[ -n "${array1[$a]}" ]] && printf '%s is in array\n' "$a"
En lo anterior, realmente no nos importan los valores, solo necesitan estar no vacíos para esto. Puede "invertir" una matriz indexada en una nueva matriz asociativa intercambiando la clave y el valor:
declare -a array1=(
prova1 prova2 slack64
)
declare -A map # required: declare explicit associative array
for key in "${!array1[@]}"; do map[${array1[$key]}]="$key"; done # see below
a=slack64
[[ -n "${map[$a]}" ]] && printf '%s is in array\n' "$a"
Esto puede ser rentable si tiene matrices grandes que se buscan con frecuencia, ya que la implementación de matrices asociativas funcionará mejor que los bucles de recorrido de matrices. Sin embargo, no se adaptará a todos los casos de uso, ya que no puede manejar duplicados (aunque puede usar el valor como un contador, en lugar de solo 1 como arriba), y no puede manejar un índice vacío.
Desglosando la línea compleja de arriba, para explicar la "inversión":
for key in "${!a[@]}" # expand the array indexes to a list of words
do
map[${a[$key]}]="$key" # exchange the value ${a[$key]} with the index $key
done
array1
trabajo?