使用Tcl在if语句中将表达式计算为true

时间:2010-11-21 23:14:16

标签: 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 ":("
}

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”是否存在......

2 个答案:

答案 0 :(得分:8)

Tcl if语句的语法是

if condition statement else statement

必须在一行上。大括号允许跨线连续,并且它们的位置是强制性的:

if { $apsta == 1 } {
    set result ":)"
} else {
    set result ":("
}

正如你所写,Tcl看到了

if { $apsta == 1 }

并停在那里会产生语法错误。

答案 1 :(得分:2)

MSW已经给你正确的答案,但我想根据你的评论,需要更多的解释来澄清你所拥有的其他一些混淆。

我将首先使用非tcl术语解释一些事情,因为我觉得它不那么令人困惑。

在tcl中,if不是声明。 if是一个功能。这就是为什么开括号需要在同一行上的原因:因为换行符终止了函数的参数列表。例如,在以下代码中:

a b c d
e f

Tcl解释器将看到两个函数调用。第一个使用参数b,c和d运行a,使用单个argumrnt f运行第二个函数e。同样,在以下内容中:

if a
   b

Tcl看到使用单个参数调用函数if。由于if期望至少有两个参数(它不是解释器本身)会引发错误,抱怨错误的参数数量。

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

proc a{b} {} {puts HA!}
a{b} ;# <-- prints out HA!

所以,如果你做了类似的事情:

if{x} {y}

tcl会抱怨函数if{x}未定义。

if并不是唯一能像这样工作的东西。 Tcl实际上没有关键字,只是标准的内置函数库,如forforeachwhile。同样的规则也适用于所有这些规则。


并不重要:

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

# 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."}]