我正在努力想弄清楚如何使用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”是否存在......
答案 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实际上没有关键字,只是标准的内置函数库,如for
,foreach
和while
。同样的规则也适用于所有这些规则。
并不重要:
另一方面,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."}]