Вам нужно буквальное имя переменной внутри конструкции ${}
.Если вы хотите сослаться на переменную, имя которой определяется во время выполнения, вам необходимо явно пройти уровень косвенности.
name="Directories${depth}[4]"
echo ${!name}
Это не помогает для назначений.Пока вы назначаете в текущей области (а не в охватывающей области), вы можете выполнять вычисляемые назначения с помощью встроенного typeset
.Однако, будьте осторожны: bash имеет эвристику, которая позволяет преобразовывать назначения, похожие на синтаксис назначения массива, в назначения массива.Это означает, что приведенный ниже код в порядке, если элемент собирается хранить абсолютное имя файла (которое всегда начинается с /
), но не если он собирается хранить произвольное имя файла (которое может быть чем-то вроде (foo)
).
typeset "Directories${depth}[4]=new value"
В качестве альтернативы возможно выполнение присваивания переменной, имя которой определяется во время выполнения с помощью любой оболочки с помощью eval
.Это имеет преимущество работы в любой оболочке, а не только в bash.Вы должны быть очень осторожны, хотя: трудно правильно процитировать цитату.Лучше всего, чтобы аргумент eval
делал как можно меньше.Используйте временную переменную для получения значения.
eval "tmp=\${Directories${depth}[4]}"
echo "$tmp"
tmp="new value"
eval "Directories${depth}[4]=\$tmp"