Предположим, я объявил следующие переменные:
$ var='$test'
$ test="my string"
Если я распечатаю их содержимое, я вижу следующее:
$ echo $var
$test
$ echo $test
my string
Я хотел бы найти способ напечатать содержание содержимого $var
(которое является содержанием $test
). Поэтому я попытался сделать следующее:
$ echo $(echo $var)
$test
Но здесь результат есть, $test
а не "my string"
... Можно ли распечатать содержимое содержимого переменных с помощью bash?
bash
shell-script
variable
echo
variable-substitution
Рафаэль Муйнарск
источник
источник
ash
, илиbash
, илиcsh
, илиdash
, ..., илиzsh
, или POSIXsh
, или вам нужно работать в разных системах?Ответы:
Вы можете сделать это, используя косвенное расширение переменной bash (если вы можете не указывать в
$
своей ссылочной переменной):3.5.3 Расширение параметров оболочки
источник
Для случая, когда имя переменной, содержащейся в
var
префиксе$
, можно использоватьeval
:Что здесь происходит:
$var
до значения$test
, производяeval echo $test
команду;eval
оцениваетecho $test
выражение и дает желаемый результат.Обратите внимание, что использование
eval
в целом может быть опасным (в зависимости от того, что хранится вvar
), поэтому предпочитайте избегать его. Функция косвенного расширения лучше для вашего случая (но вам нужно избавиться от$
входа$test
).источник
eval
, вам нужно два слоя двойных кавычках, выравнивают это:eval echo "\"$var\""
. Имейте в виду, это не имеет ничего общего с другими опасностями использования,eval
которые вы упомянули.Аналогичен ответу Jesse_b , но вместо ссылки на переменную используется переменная ссылки на имя (требуется
bash
4.3+):Ссылочная переменная name
var
содержит имя переменной, на которую она ссылается. Когда переменная разыменовывается как$var
, возвращается значение другой переменной.bash
разрешает ссылки на имена рекурсивно:Для полноты, использование ассоциативного массива (в
bash
4.0+) также является одним из способов решения этой проблемы, в зависимости от требований:Это обеспечивает более гибкий способ доступа к нескольким значениям по ключу или имени, которые могут определяться динамически. Это может быть предпочтительным, если вы хотите собрать все значения определенной категории в одном массиве, но при этом иметь возможность доступа к ним по некоторому ключу (например, имена, доступные по идентификатору, или пути, доступные по назначению и т. Д.), Поскольку это не загрязняет переменное пространство имен скрипта.
источник
С
zsh
:С любой борновидной оболочкой
Помните, что в этих оболочках расширения переменных должны заключаться в кавычки, чтобы не допустить split + glob (
zsh
будучи исключением), иecho
не могут использоваться для произвольных данных.Поскольку и то,
(e)
и другое иeval
есть оценка шелл-кода, важно, чтобы содержание$var
оставалось в вашем контроле, иначе это может быть произвольной уязвимостью, связанной с введением команд (то же самое с${!var}
подходами).источник