вычисление выражения в true в операторе if с Tcl - PullRequest
0 голосов
/ 22 ноября 2010

У меня серьезные проблемы, когда я пытаюсь понять, как оценить выражение в операторе If, используя Tcl.Это то, что у меня есть:

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

8 голосов
/ 22 ноября 2010

Синтаксис оператора Tcl if:

if condition statement else statement

который должен быть в одной строке. Скобки допускают продолжение через строки и их размещение обязательно:

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

Как вы уже написали, Tcl видит

if { $apsta == 1 }

и останавливается там, приводя к синтаксической ошибке.

2 голосов
/ 23 ноября 2010

MSW уже дали вам правильный ответ, но я думаю, что нужно немного больше объяснений, чтобы прояснить некоторые другие недоразумения, которые у вас возникают, основываясь на ваших комментариях.

Сначала я объясню вещи с использованием non-tclтерминология, так как я думаю, что это менее запутанно таким образом.

В tcl, if не является утверждением.if - это функция.По этой причине открывающая фигурная скобка должна находиться на одной строке: новая строка завершает список аргументов функции.Например, в следующем коде:

a b c d
e f

интерпретатор Tcl увидит два вызова функций.Первый для работы a с аргументами b, c и d, а второй для работы e с одним аргументом f.Аналогично, в следующем:

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.Для всех них применяются одинаковые правила.


не очень важно:

С другой стороны, функция if в tcl работает как троичный операторв 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."}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...