首页 > 解决方案 > 使用eval时双括号加“-n”

问题描述

我目前正在尝试使用 [[]] 进行动态测试并评估代码,但是在条件开始时会自动添加一个-n。所以我的条件总是正确的......

这里有一个 set -x 的例子:

myCondition='${queueName} == ${pattern}'
pattern="COMPLETELY_DIFFERENT_PATTERN"
queueName="QM.GCS.SRC.TOTO"
set -x ; [[ $(eval echo $myCondition ) ]] && echo CORRECT; set +x
++ eval echo '${queueName} == ${pattern}'
+++ echo QM.GCS.SRC.TOTO == COMPLETELY_DIFFERENT_PATTERN
+ [[ -n QM.GCS.SRC.TOTO == COMPLETELY_DIFFERENT_PATTERN ]]
+ echo CORRECT
CORRECT
+ set +x

为什么要添加 -n ?因为只有一个参数?

我怎样才能让它按我的意愿工作?

标签: bashtestingevalbuilt-insquare-bracket

解决方案


[[隐式禁用字符串拆分,这样扩展不会拆分为多个参数。

单项测试隐式运行-n,测试该项是否为空字符串。

因此,如果您希望将条件的各个部分作为 的单独参数进行评估[[,您应该在[[ , 中使用, 以便将条件替换为在的解析规则生效之前eval包含的文本。 [[

eval "[[ $myCondition ]]"

因此,这将使您的代码:

myCondition='${queueName} == ${pattern}'
pattern="COMPLETELY_DIFFERENT_PATTERN"
queueName="QM.GCS.SRC.TOTO"
set -x ; eval "[[ $myCondition ]]" && echo CORRECT; set +x

...在 stderr 上发出预期的日志:

+ eval '[[ ${queueName} == ${pattern} ]]'
++ [[ QM.GCS.SRC.TOTO == COMPLETELY_DIFFERENT_PATTERN ]]
+ set +x

推荐阅读