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