Використовуйте інший тип масиву: замість масиву, індексованого цілим числом, використовуйте асоціативний масив, тому ключ (індекс) - це те, що ви будете перевіряти. 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
працює?