2009-05-11 14 views
0

Ich habe einig Tcl-Skripte, die durch die Definition von Variablen in dem Befehlszeilenaufruf ausgeführt werden:Wie setzt man Standardwerte für Tcl-Variablen?

$ tclsh84 -cmd <script>.tcl -DEF<var1>=<value1> -DEF<var2>=<value2> 

einen Weg gibt, es zu überprüfen, ob var1 und var2 sind nicht in der Befehlszeile definiert und sich dann mit einem zuweisen Standardwerte?

versuchte ich die Schlüsselwörter global, variabel und Set, aber sie alle geben mir diese Fehlermeldung, wenn ich "if {$<var1>==""}" sagen: "can't read <var1>: no such variable"

Antwort

5

Ich bin nicht vertraut mit der Option -def auf tclsh.

jedoch zu prüfen, ob eine Variable gesetzt ist, statt ‚fangen‘ verwenden, können Sie auch ‚info existieren‘ verwenden:

if { ![info exists blah] } { 
    set blah default_value 
} 
+0

Danke! Das hat für mich funktioniert. –

+0

Es gibt keine '-def' Option; 'tclsh' zieht es vor, das Skript so oft wie möglich zu verlassen. –

0

Sie Ihren Befehl Abbruch des Skriptfehler zu verhindern catch kann.

if { [ catch { set foo $<var1> } ] } { 
    set <var1> defaultValue 
} 

(Warnung: Ich nicht die genaue Syntax mit einem TCL-Interpreter überprüfen habe, ist das obige Skript nur die Idee zu geben).

1

Alternativ können Sie so etwas wie die cmdline Paket von tcllib verwenden. Auf diese Weise können Sie Standardwerte für binäre Flags und Name/Wert-Argumente festlegen und ihnen Beschreibungen geben, sodass eine formatierte Hilfemeldung angezeigt werden kann.

package require cmdline 
set sUsage "Here you put a description of what your program does" 
set sOptions { 
    {inputfile.arg "" "Input file name - this is required"} 
    {outputfile.arg "out.txt"  "Output file name, if not given, out.txt will be used"} 
    {compressoutput  "0"  "Binary flag to indicate whether the output file will be compressed"} 
} 

array set options [::cmdline::getoptions argv $sOptions $sUsage] 
if {$options(inputfile) == ""} {puts "[::cmdline::usage $sOptions $sUsage]";exit} 

Der .arg Suffix zeigt dies ist ein Name: Zum Beispiel, wenn Sie ein Programm, das einen Eingabedateinamen und optional einen Ausgabedateinamen und eine binäre Option erfordert die Ausgabe zu komprimieren, können Sie so etwas wie verwenden/value pair Argument, wenn das nicht aufgeführt ist, wird davon ausgegangen, dass es sich um ein binäres Flag handelt.

Verwandte Themen