${!FOO}
выполняет двойную подстановку bash
, то есть принимает (строковое) значение FOO и использует его в качестве имени переменной.
zsh
не поддерживает эту функцию.
Есть ли способ сделать эту работу такой же в bash
и zsh
?
Фон:
У меня есть список переменных среды, как
PATH MAIL EDITOR
и хотите сначала вывести имена переменных, а затем их значения.
Это работает, bash
но не zsh
:
for VAR in LIST
do
echo $VAR
echo ${!VAR}
done
Это должно быть как-то возможно по-старому eval
, но я не могу заставить его работать:
for VAR in LIST
do
echo $VAR
echo `eval \$$VAR`
done
Я никогда не пойму, почему я не могу просто сделать произвольные глубокие замены, такие как ${${VAR}}
или даже ${${${VAR}}}
если это необходимо, поэтому объяснение этого было бы тоже неплохо.
bash
, он действительно имеет ту же функцию (и намного больше), использует только другой шаблон, а именно ${(p)FOO}
.
(e)
флаг расширения параметров zsh был добавлен в zsh-2.6-beta17 (май 1996 г.), (P)
флаг в 3.1.5-pws-7 (1999 г.). Баш ${!var}
в 2.0 (декабрь 1996).