使用测试时的怪异结果

问题描述 投票:-1回答:1

有一个名为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来格式化第一条语句吗?

shell testing eval
1个回答
1
投票
eval "if test -n \$${a}; then echo Y; fi"

与以下相同,其中ab

eval 'if test -n $b; then echo Y; fi'

由于未设置b,并且$bunquoted,它在扩展后实际上丢失了,因此eval评估以下内容:

if test -n; then echo Y; fi

由于-n不是空字符串,test -n的值为true,并且执行了echo Y

© www.soinside.com 2019 - 2024. All rights reserved.