${!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).