使用测试时出现奇怪的评估结果

Weird eval result when using test

得到一个名为 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"

与以下相同 ab:

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

因为 b 未设置,并且 $b 未引用 ,它在扩展后实际上丢失了,因此 eval 计算如下:

if test -n; then echo Y; fi

因为 -n 不是空字符串,test -n 计算结果为真并执行 echo Y