Странный eval результат при использовании теста - PullRequest
0 голосов
/ 29 января 2020

Получил переменную с именем 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 на всем протяжении?

1 Ответ

1 голос
/ 29 января 2020
eval "if test -n \$${a}; then echo Y; fi"

совпадает со следующим, где a равно b:

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

Поскольку b не установлено, а $b равно без кавычек , оно буквально теряется после раскрытия, поэтому eval оценивает следующее:

if test -n; then echo Y; fi

Поскольку -n не является пустой строкой, test -n оценивается как true и echo Y выполняется.

...