Если вам нужна производительность, вы не хотите перебирать весь массив каждый раз при поиске.
В этом случае вы можете создать ассоциативный массив (хеш-таблицу или словарь), который представляет индекс этого массива. То есть он отображает каждый элемент массива в свой индекс в массиве:
make_index () {
local index_name=$1
shift
local -a value_array=("$@")
local i
# -A means associative array, -g means create a global variable:
declare -g -A ${index_name}
for i in "${!value_array[@]}"; do
eval ${index_name}["${value_array[$i]}"]=$i
done
}
Тогда вы можете использовать это так:
myarray=('a a' 'b b' 'c c')
make_index myarray_index "${myarray[@]}"
И проверить членство вот так:
member="b b"
# the "|| echo NOT FOUND" below is needed if you're using "set -e"
test "${myarray_index[$member]}" && echo FOUND || echo NOT FOUND
Или также:
if [ "${myarray_index[$member]}" ]; then
echo FOUND
fi
Обратите внимание, что это решение работает правильно, даже если в проверенном значении или в значениях массива есть пробелы.
В качестве бонуса вы также получаете индекс значения в массиве с помощью:
echo "<< ${myarray_index[$member]} >> is the index of $member"