Я пытаюсь получить размер массива , но я не знаю имя массива до времени выполнения (он создается динамически на основе списка из файла), поэтому я пытаюсь использоватьперенаправление bash с ${!var}
.
Этот ответ очень близок ( Как перебрать массив с помощью косвенной ссылки? ), но ему не хватает массива размер ${#var[@]}
работа
Примечание: Я пытаюсь избежать eval
, и у меня Bash> = 4.0, но <4.3 (поэтому я не могу использовать <code>declare -n).И я бы предпочел не выполнять итерацию по всему массиву для вычисления размера, поскольку он может стать очень большим.
Что у меня работает:
# Declare dynamic arrays
for env in INT PROD; do
declare -A "values$env"
done
# Creates 'valuesINT[]' and valuesPROD[]' arrays
while IFS=$'\n'=, read -r key env val; do
# Assigns val to index key in dynamic array name values$env
declare "values$env[$key]=$val"
done <my_file
# Output arrays
for env in INT PROD; do
valuesArrName="values${env}[@]"
echo ${!valuesArrName} # this works to output all values
done
Так что я могу использовать косвенное обращение с ${!valuesArrName}
для вывода значений
Но я не могу использовать косвенное обращение, чтобы получить размер массива:
valuesArrName="values${env}[@]"
echo ${#!valuesArrName}
# OUTPUT: ${#!valuesArrName}: bad substitution
valuesArrName="#values${env}[@]"
echo ${!valuesArrName}
# OUTPUT: #valuesINT[@]: bad substitution
valuesArrName="#values${env}"
echo ${!valuesArrName[@]}
# OUTPUT: no error, but always 0