Use um tipo diferente de matriz: em vez de uma matriz indexada por número inteiro, use uma matriz associativa; portanto, a chave (índice) é o que você procurará. bash-4.0
ou posterior é necessário para isso.
declare -A array1=(
[prova1]=1 [prova2]=1 [slack64]=1
)
a=slack64
[[ -n "${array1[$a]}" ]] && printf '%s is in array\n' "$a"
No exposto acima, nós realmente não nos importamos com os valores, eles precisam estar apenas vazios para isso. Você pode "inverter" uma matriz indexada em uma nova matriz associativa trocando a chave e o 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"
Isso pode valer a pena se você tiver grandes matrizes que são frequentemente pesquisadas, pois a implementação de matrizes associativas terá um desempenho melhor do que os loops que atravessam a matriz. Porém, ele não serve para todos os casos de uso, pois não pode manipular duplicatas (embora você possa usar o valor como um contador, em vez de apenas 1 como acima), e não pode manipular um índice vazio.
Rompendo a linha complexa acima, para explicar a "inversão":
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
trabalho?