有一个名为a
的变量:
unset b
a="b"
尝试采用此声明:
if test -n "$(eval \$${a})"; then echo Y; fi
# Outputs nothing
效果很好-它将\$${a}
评估为$b
,它为空且不回显。
试图将以上内容转换为与此类似的内容:
eval "if test -n \$${a}; then echo Y; fi"
# Outputs "Y"
这不起作用-甚至更奇怪:
eval "if test -z \$${a}; then echo Y; fi"
# Outputs "Y"
为什么?对于以上两种情况,同一条语句如何输出Y
?我可以尝试使用eval
来格式化第一条语句吗?
eval "if test -n \$${a}; then echo Y; fi"
与以下相同,其中a
为b
:
eval 'if test -n $b; then echo Y; fi'
由于未设置b
,并且$b
被unquoted,它在扩展后实际上丢失了,因此eval
评估以下内容:
if test -n; then echo Y; fi
由于-n
不是空字符串,test -n
的值为true,并且执行了echo Y
。