Intereting Posts
Пользователь имеет права на запись, но не может записывать файлы sed не работает из файла sh, но работает из командной строки убить весь процесс исполняемых файлов в папке Получить одинаковые / и т. Д. В разных операционных системах Как tcp связывается с приложением? LUKS encryption Mint – только просьба расшифровать один из двух моих зашифрованных дисков рыба + сценарий -> хаос, какие варианты? Как вы можете избежать сглаживания конфигурационных файлов при установке с помощью make Команды SM- * не распознаются Emacs Как заменить часть имени хоста на xauth (OLD: как перенаправить вывод команды xauth?) Почему mdadm считает мой raid1 «неудачным, поэтому использование –add не может работать»? ixgbe: увеличение производительности rx Почему мой USB-адаптер беспроводной сети отключается каждые несколько секунд? Почему изображения wmaker сокращаются? Как заставить BusyBox udhcpc работать в фоновом режиме навсегда?

как получить размер косвенного массива в bash?

Без использования eval.

это не будет работать:

astr=(abc) str="#astr[@]" echo "${!str}" 

Из подсказки здесь мне удалось это сделать:

 astr=(abc) declare -n astrRef="astr" echo ${#astrRef[@]} 

Это позволяет также создавать такой массив или просто присваивать значения через косвенность:

 declare -n astrRef="astr" astrRef=(def) declare -p astrRef astr astrRef+=(g) declare -p astrRef astr 

Что об этом, что работает хотя бы на bash 3.x и выше:

 astr=(abc) str=astr[@] # Our reference to an array local arr=("${!str}") # Copy into an array using indirect ref echo ${#arr[*]} # 3 bstr=("a foo" "a bar" "a fox" "a buzz") str=bstr[@] local arr=("${!str}") echo ${#arr[*]} # 4 

Мы используем local ключевое слово, чтобы наша рабочая переменная arr локальной для функции, но это необязательно. Фактически из-за ограничения bash, arr может также использоваться для доступа к элементам в (косвенном) массиве, например:

 echo ${arr[1]} # Print 2nd element echo ${#arr[1]} # ... print its size 

(Протестировано в bash 3.1.23 , bash 4.3.48 и 4.4.12)