使用Tcl在if语句中将表达式求值为true

使用Tcl在if语句中将表达式求值为true,tcl,Tcl,我有很多大人物试图弄清楚如何使用Tcl计算If语句中的表达式。这就是我所拥有的: #!/bin/sh #The next line executes wish - wherever it is \ exec wish "$0" "$@" set apid "/var/run/apache2.pid" set apsta [file exist $apid] if { $apsta == 1 } { set result ":)" } else { set result

我有很多大人物试图弄清楚如何使用Tcl计算If语句中的表达式。这就是我所拥有的:

#!/bin/sh
#The next line executes wish - wherever it is \
exec wish "$0" "$@"

set apid "/var/run/apache2.pid"

set apsta [file exist $apid]

if { $apsta == 1 }

{
    set result ":)"
}

else

{
    set result ":("
}

label .status -text $result
pack .status
这是我从终点站得到的:

# wan27
Error in startup script: wrong # args: no script following " $apsta == 1 " argument
    while executing
"if { $apsta == 1 }"
    (file "/usr/bin/wan27" line 9)

如果Apache正在运行,我只是想输出一个快乐的笑脸,如果Apache停止,我只是想输出一个悲伤的笑脸——基于布尔条件,即文件“/var/run/apache2.pid”是否存在……

如果语句

if condition statement else statement
必须在一条线上。大括号允许跨线延伸,其位置是必需的:

if { $apsta == 1 } {
    set result ":)"
} else {
    set result ":("
}
正如您所写的,Tcl看到

if { $apsta == 1 }

MSW已经给了你正确的答案,但我认为需要更多的解释来澄清你在评论中遇到的其他困惑

我将首先使用非tcl术语解释事情,因为我认为这样比较容易混淆

在tcl中,
if
不是一条语句<代码>如果是一个函数。这就是为什么大括号必须在同一行上的原因:因为换行符终止函数的参数列表。例如,在以下代码中:

a b c d
e f
Tcl解释器将看到两个函数调用。第一个使用参数b、c和d执行函数
a
,第二个使用参数f执行函数
e
。同样,在以下方面:

if a
   b
# It is unfortunate that this "give" function is not built in.
# We use it to return something from if without actually
# calling return:
proc give {x} {return $x}

set something [if {$x} {give "Very true indeed."} {give "Unfortunately false."}]
Tcl通过一个参数看到对函数
if
的调用。因为
if
至少需要两个参数,所以它(而不是解释器本身)会抛出一个错误,抱怨参数的数量错误

这也解释了为什么if和它的第一个参数之间必须有一个空格。这只是因为在tcl中,变量和函数的名称可以包含几乎任何内容,包括空格、逗号和非打印字符(如NUL)。例如,您可以定义一个名为
a{b}
的函数:

proc a{b} {} {puts HA!}
a{b} ;# <-- prints out HA!
如果未定义{x},tcl将抱怨函数

如果
不是唯一这样工作的东西。Tcl实际上没有关键字,只是一个标准的内置函数库,如
for
foreach
while
。同样的规则适用于所有这些国家


不太重要:

另一方面,tcl中的
if
函数与C中的三元运算符类似:它返回一个值。事实上,您可以执行以下操作:

if a
   b
# It is unfortunate that this "give" function is not built in.
# We use it to return something from if without actually
# calling return:
proc give {x} {return $x}

set something [if {$x} {give "Very true indeed."} {give "Unfortunately false."}]

您几乎必须在Tcl中使用一种真正的大括号样式(尽管选择您自己的缩进规则,但我更喜欢3或4个空格),因为否则语言会在第一个换行符处结束语句。你唯一的选择是在你想继续的行的末尾加上额外的反斜杠,但我认为这更糟糕。(或者,在命令之间用分号在一条很长的行上写东西。很难看,但没有大括号/缩进问题。)好的,我现在明白了,这就解释了“没有脚本跟随”的原因。解释器希望在同一行中有一个大括号,然后是if语句。我还注意到关键字if需要用空格分隔,并且不能粘在求值符号上,例如if{}。还要注意,
[file exists…]
返回一个真/假结果,因此您不必显式地将结果与1比较:
if{$apsta}{…}