Tcl expr$a eq$b为什么会以“失败”而失败;无效的裸字“;?

Tcl expr$a eq$b为什么会以“失败”而失败;无效的裸字“;?,tcl,Tcl,我有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命令中的表达式不一

我有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命令中的表达式不一样吗?

不,它不一样。您看到的内容与
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
括号内。这样做可以避免许多问题,这是一个比较温和的问题

文档:

需要记住的要点:1)
expr
获取一个参数字符串并对其求值。2) 多个参数以空格连接。3)
expr{a eq b}
不是有效的表达式,必须用引号引字符串,例如:
expr{{a}eq{b}
类似: