fabjoa
fabjoa

Reputation: 1615

evaluating an expression to true in a if statement with Tcl

I'm having serious biggies trying to figure out how to evaluate an expression in a If statement using Tcl. This is what I have:

#!/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

and this is what I get from the terminal:

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

I'm just trying to output a happy smiley if Apache is running, a sad one if Apache is stopped - based upon the boolean condition whether or not the file "/var/run/apache2.pid" exists ...

Upvotes: 0

Views: 12686

Answers (2)

slebetman
slebetman

Reputation: 113886

MSW have already given you the correct answer but I think a little bit more explanation is needed to clear up some other confusions you are having based on your comments.

I will first explain things using non-tcl terminology since I think it is less confusing that way.

In tcl, if is not a statement. if is a function. That is the reason why the opening brace need to be on the same line: because a newline terminates the list of arguments to a function. For example, in the following code:

a b c d
e f

the Tcl interpreter will see two function calls. The first to function a with arguments b, c and d and the second to function e with a single argumrnt f. Similarly, in the following:

if a
   b

Tcl sees a call to the function if with a single argument. Since if expects at least two arguments it (not the interpreter itself) throws an error complaining about wrong number of arguments.

This also explains why there must be a space between if and its first argument. It's just because in tcl names of variables and functions are literally allowed to contain almost anything including spaces, commas and non-printing characters like NUL. For example, you can define a function called a{b}:

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

So if you do something like:

if{x} {y}

tcl will complain that the function if{x} is not defined.

if is not the only thing that works like this. Tcl doesn't really have keywords, just a standard library of built-in functions like for, foreach and while. The same rules apply to all of them.


not really important:

On a side, the if function in tcl works like the ternary operator in C: it returns a value. In fact you can do the following:

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

Upvotes: 3

msw
msw

Reputation: 43487

The syntax of a Tcl if statement is

if condition statement else statement

which must be on one line. Braces allow continuation across lines and their placement is mandatory:

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

As you have it written, Tcl sees

if { $apsta == 1 }

and stops there yielding a syntax error.

Upvotes: 10

Related Questions