Вы можете сделать это без использования eval
.bash
предоставляет способ ссылки имен переменных / массивов с помощью встроенных модулей name-ref (typeset/local or declare -n
) (требуется v4.3 из bash
как минимум).
Вы можете просто сделать
for array in "${hosts[@]}"; do
declare -n arr="$array"
for elem in "${arr[@]}"; do
if [[ $elem =~ (^|[^[:alpha:]])$value([^[:alpha:]]|$) ]]; then
printf '%s\n' "$elem"
fi
done
done
При желании вы также можете распечатать массив, из которого он найден, используя array
переменную
printf 'Array Name = %s\n' "$array"
Также см. BashFAQ / 006 - Как я могу использовать переменные (косвенные переменные, указатели, ссылки) или ассоциативные массивы?