2009-05-11 4 views
0

J'ai quelques scripts Tcl qui sont exécutées par la définition des variables dans l'invocation de ligne de commande:Comment définir les valeurs par défaut pour les variables Tcl?

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

Est-il un moyen de vérifier si var1 et var2 ne sont pas définis à la ligne de commande, puis leur attribuer une ensemble de valeurs par défaut?

J'ai essayé les mots-clés global, variable et ensemble, mais ils me donnent cette erreur quand je dis "if {$<var1>==""}": "can't read <var1>: no such variable"

Répondre

5

Je ne suis pas familier avec l'option -def sur tclsh.

Cependant, pour vérifier si une variable est définie, au lieu d'utiliser « attraper », vous pouvez également utiliser « information existe »:

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

Merci! Cela a fonctionné pour moi. –

+0

Il n'y a pas d'option '-def'; 'tclsh' préfère laisser autant que possible au script. –

0

Vous pouvez catch votre commande pour éviter les erreurs de script avorter.

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

(Attention: Je n'ai pas vérifié la syntaxe exacte avec un interpréteur TCL, le script ci-dessus est juste pour donner l'idée).

1

Vous pouvez aussi utiliser quelque chose comme le paquet cmdline de tcllib. Cela vous permet de définir des valeurs par défaut pour les indicateurs binaires et les arguments nom/valeur, et de leur donner des descriptions afin qu'un message d'aide formaté puisse être affiché. Par exemple, si vous avez un programme qui nécessite un nom de fichier d'entrée, et le cas échéant un nom de fichier de sortie et une option binaire pour compresser la sortie, vous pouvez utiliser quelque chose comme:

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} 

Le suffixe .arg indique que cela est un nom/argument paire de valeurs, si cela n'est pas listé, il supposera qu'il s'agit d'un drapeau binaire.

Questions connexes