我有TCL 8.6,以下代码正常工作:
set a abc
set b abcd
if {$a eq $b} {puts hi}
但是下面的错误让我错过了:
set a abc
set b abcd
expr $a eq $b
invalid bareword "abc"
in expression "abc eq abcd";
should be "$abc" or "{abc}" or "abc(...)" or ...
我想知道发生了什么事?这不是if命令中的条件表达式与expr命令中的表达式相同吗?
答案 0 :(得分:7)
不,这不一样。您看到的内容与expr
看到的内容之间存在差异,即它将尝试评估的字符串。这是因为命令调用的每个单词(就像在Tcl中的每个命令调用一样)在执行命令之前都会被替换。
第一种情况:大括号会阻止表达式的内容过早地被替换。您看到{$a eq $b}
,expr
看到$a eq $b
。这是两个操作数($a
和$b
)和一个运算符(eq
):expr
可以使用它。
第二种情况:三个参数在传递给expr
之前被替换。您看到$a eq $b
,expr
看到abc eq abcd
。这是两个无意义的值和一个运算符,expr
无法处理。
如果某个字符串不是布尔值或expr
表达式中的运算符名称,则它应该是变量替换($abc
)的一部分,或者是函数(abc(...)
)或命令替换的一部分([... abc ...]
),或者明确引用("abc"
或{abc}
)。
始终将参数括起来expr
。这样做可以防止许多问题,这是一个较温和的问题。
文档:expr