Получить размер массива с косвенной ссылкой на имя - PullRequest
1 голос
/ 21 сентября 2019

Я пытаюсь получить размер массива , но я не знаю имя массива до времени выполнения (он создается динамически на основе списка из файла), поэтому я пытаюсь использоватьперенаправление 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
...