Аналогичен ответу Jesse_b , но вместо ссылки на переменную используется переменная ссылки на имя (требуется bash
4.3+):
$ declare -n var=test
$ test="my string"
$ echo "$var"
my string
Ссылочная переменная name var
содержит имя переменной, на которую она ссылается. Когда переменная разыменовывается как $var
, возвращается значение другой переменной.
bash
разрешает ссылки на имена рекурсивно:
$ declare -n var1=var2
$ declare -n var2=test
$ test="hello world"
$ echo "$var1"
hello world
Для полноты, использование ассоциативного массива (в bash
4.0+) также является одним из способов решения этой проблемы, в зависимости от требований:
$ declare -A strings
$ strings[test]="my string"
$ var=test
$ echo "${strings[$var]}"
my string
Это обеспечивает более гибкий способ доступа к нескольким значениям по ключу или имени, которые могут определяться динамически. Это может быть предпочтительным, если вы хотите собрать все значения определенной категории в одном массиве, но при этом иметь возможность доступа к ним по некоторому ключу (например, имена, доступные по идентификатору, или пути, доступные по назначению и т. Д.), Поскольку это не загрязняет переменное пространство имен скрипта.