2010-11-21 17 views
0

Ich habe ernsthafte Biggies, die versuchen herauszufinden, wie man einen Ausdruck in einer If-Anweisung mit Tcl auswertet. Das ist, was ich habe:Auswerten eines Ausdrucks in einer If-Anweisung mit Tcl

#!/bin/sh 
#The next line executes wish - wherever it is \ 
exec wish "$0" "[email protected]" 

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 

und das ist, was ich von dem Terminal erhalten:

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

Ich bin nur ein glückliche Smiley Ausgang versuchen, wenn Apache läuft, ein trauriger, wenn Apache gestoppt wird - basierend, ob auf der booleschen Bedingung oder nicht die Datei „/var/run/apache2.pid“ existiert ...

+0

Sie haben ziemlich viel mit Tcl One True Brace Stil zu verwenden bekommen (obwohl Ihre eigene Einbuchtung Regeln wählen, aber ich ziehe es 3 oder 4 Leerzeichen), da sonst die Sprachanweisungen enden an der ersten Zeilenumbruch. Ihre einzige Alternative ist es, zusätzliche Backslashes am Ende der Zeilen hinzuzufügen, die Sie fortsetzen möchten, aber ich denke, das ist * far * mehr. (Alternativ schreiben Sie Dinge auf eine sehr lange Zeile mit Semikolons zwischen Befehlen. Hässlich, aber keine Klammer/Einrückung Probleme.) –

+0

ok, ich bekomme es jetzt, und das würde das "no script following" dingy erklären. Der Interpreter erwartete eine Klammer in derselben Zeile wie die if-Anweisung. Ich habe auch bemerkt, dass das Schlüsselwort, wenn es durch ein Leerzeichen getrennt werden sollte und nicht auf das Auswertungssymbol geklebt werden konnte, wie wenn {} – fabjoa

+0

Beachten Sie auch, dass '[Datei existiert ...]' gibt ein wahr/falsch Ergebnis, also Sie muss das Ergebnis nicht explizit mit 1 vergleichen: 'if {$ apsta} {...}' –

Antwort

8

die Syntax einer Anweisung Tcl if ist

if condition statement else statement 

, die sich in einer Zeile befinden müssen. Zahnspange erlauben Fortsetzung über Linien und deren Platzierung ist obligatorisch:

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

Wie Sie haben geschrieben, Tcl sieht

if { $apsta == 1 } 

und hält dort einen Syntaxfehler ergeben.

+0

+1: Das ist das Problem genau dort. –

+0

direkt vor Ort! danke msw – fabjoa

2

MSW haben Ihnen bereits die richtige Antwort gegeben, aber ich denke, ein wenig mehr Erklärung ist erforderlich, um einige andere Verwirrungen, die Sie basierend auf Ihren Kommentaren haben, zu klären.

Ich werde zuerst Dinge erklären, die Nicht-Tcl-Terminologie verwenden, da ich denke, dass es auf diese Weise weniger verwirrend ist.

In tcl, if ist keine Aussage. if ist eine Funktion. Das ist der Grund, warum die öffnende Klammer in der gleichen Zeile sein muss: weil ein Newline die Liste der Argumente zu einer Funktion beendet. Beispiel: Im folgenden Code:

a b c d 
e f 

Der Tcl-Interpreter sieht zwei Funktionsaufrufe. Die erste Funktion ist a mit den Argumenten b, c und d und die zweite Funktion e mit einem einzelnen Argument f. Ebenso im folgenden:

if a 
    b 

Tcl sieht einen Aufruf der Funktion if mit einem einzigen Argument. Da if mindestens zwei Argumente erwartet, gibt es (nicht der Interpreter selbst) einen Fehler, der sich über die falsche Anzahl von Argumenten beschwert.

Dies erklärt auch, warum zwischen If und seinem ersten Argument ein Leerzeichen stehen muss. Es ist nur, weil in tcl Namen von Variablen und Funktionen buchstäblich alles enthalten dürfen einschließlich Leerzeichen, Kommas und nicht-druckbare Zeichen wie NUL.

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

Also, wenn Sie so etwas wie:: Zum Beispiel können Sie eine Funktion a{b} genannt definieren

if{x} {y} 

tcl wird sich beschweren, dass die Funktion if{x} nicht definiert ist.

if ist nicht die einzige Sache, die so funktioniert.Tcl hat nicht wirklich Schlüsselwörter, nur eine Standardbibliothek eingebauter Funktionen wie for, foreach und while. Für alle gelten dieselben Regeln.


nicht wirklich wichtig:

Auf einer Seite, die if Funktion in tcl funktioniert wie der ternäre Operator in C: es einen Wert zurückgibt. In der Tat kann man wie folgt vorgehen:

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