Используйте другой тип массива: вместо целочисленного массива используйте ассоциативный массив, поэтому ключ (индекс) - это то, что вы будете проверять. bash-4.0
или позже требуется для этого.
declare -A array1=(
[prova1]=1 [prova2]=1 [slack64]=1
)
a=slack64
[[ -n "${array1[$a]}" ]] && printf '%s is in array\n' "$a"
Выше мы не заботимся о значениях, для этого они должны быть непустыми. Вы можете «инвертировать» индексированный массив в новый ассоциативный массив, заменив ключ и значение:
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"
Это может окупиться, если у вас есть большие массивы, которые часто ищут, поскольку реализация ассоциативных массивов будет работать лучше, чем циклы обхода массива. Тем не менее, он не подходит для каждого варианта использования, поскольку не может обрабатывать дубликаты (хотя вы можете использовать значение в качестве счетчика вместо 1, как указано выше) и не может обрабатывать пустой индекс.
Разбивая сложную линию выше, объясните «инверсию»:
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
работает?