Описание тега pbuilder
Краткое изложение вопроса:
Есть встроенный Баш способ, чтобы подсчитать количество элементов в bash массив, где имя массива является динамическим (т. е. храниться в переменной), не прибегая к делать полностью копию массива или с помощью функции eval
?
Более подробная информация:
Используете bash подстановка, можно сделать следующее:
- Определить длину массива:
myArr=(А Б); Эхо ${#myArr[@]}
. - Косвенно ссылаться на переменную по имени:
Имя=аргумент myVar; Эхо ${!Имя}
(это также относится и к элементам массива):
Имя=myArr[1]; Эхо ${!Имя}
Но если имя массива хранится в другой переменной, как можно определить количество элементов в массиве? (Можно считать это сочетание двух описанных выше параметра замен.) Например:
myArr=(А B С D)
Имя=myArr
# Получаем количество элементов в массиве косвенно ссылаются по имени.
граф=${#$имя[@]} # этот синтаксис является недопустимым. Как правильно?
Ниже приведены несколько попыток, что все плохо:
# Настройки для следующей попытки:
myArr=(А B С D)
Имя=myArr
ВЫРАЖЕНИЕ1=$имя[@] # т. е. ВЫРАЖЕНИЕ1='myArr[@]'
ВЫРАЖЕНИЕ2=#$имя[@] # т. е. ВЫРАЖЕНИЕ2='#myArr[@]'
# Неудачных попыток получения длины массива косвенно:
1. граф=${#$имя[@]} # ошибка: Баш: ...: плохая замена
2. счетчик=${#!ВЫРАЖЕНИЕ1} # ошибка: Баш: !Выражение}: событие не найдено
3. счетчик=${#\!ВЫРАЖЕНИЕ1} # ошибка: Баш: ...: плохая замена
4. счетчик=${!#ВЫРАЖЕНИЕ1} # ошибка: Баш: ...: плохая замена
5. граф=${!ВЫРАЖЕНИЕ2} # возвращает значение null
Я также попробовал некоторые другие варианты выше, но пока не нашли ничего, что работает без либо: (a) создание копии массива или (B) с помощью функции eval
.
Методы Работы:
Существует несколько способов решения этой, которая, вероятно, не оптимальная (но поправьте меня, если я ошибаюсь):
Способ 1: копируем массив
Назначить массива в другой (статически-имени) переменной и получить количество элементов в нем.
ВЫРАЖЕНИЕ=$ИМЯ[@]
arrCopy=( "${!Выражение}" )
граф=${#arrCopy}
Способ 2: Используйте функцию eval
Выражение="считать=\${#$имя[@]}" # т. е. считать=${myArr[@]}'
ивал $ВЫРАЖ
# Теперь посчитайте значение длины массива
Резюме:
Есть ли встроенный метод (т. е. синтаксис подстановки параметра) в Bash для определения длины массива косвенно? Если нет, то какой самый эффективный способ сделать это? Я предполагаю, что это ивала
выше способом, но есть безопасности или проблемах с производительностью ивала
?