${!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和zsh都有执行间接扩展的方法,但是它们使用不同的语法。
使用eval
;执行间接扩展非常容易。这适用于所有POSIX和大多数Bourne外壳。如果该值包含在外壳程序中具有特殊含义的字符,请务必正确引用。
eval "value=\"\${$VAR}\""
echo "$VAR"
echo "$value"
${${VAR}}
不起作用,因为它不是任何Shell都实现的功能。大括号内的内容必须符合不包含的语法规则${VAR}
。(在zsh中,这是受支持的语法,但是做了一些不同的操作:嵌套替换对相同的值执行连续的转换;${${VAR}}
这等效于$VAR
因为它对值进行两次身份转换。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句