2009-05-11 29 views
0

私は、コマンドライン呼び出しで変数を定義することによって実行されるいくつかのTclスクリプトがあります。Tcl変数のデフォルト値を設定する方法は?

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

はVAR1とVAR2は、コマンドラインで定義されていないかどうかを確認し、その後でそれらを割り当てる方法はありますデフォルト値のセット?

私は変数、グローバルなキーワードを試してみました、と設定されますが、私は"if {$<var1>==""}"を言うとき、彼らはすべての私は、このエラーを与える:"can't read <var1>: no such variable"

答えて

5

私はtclshの-defオプションに慣れていません。

はしかし、変数が設定されているかどうかを確認するために、代わりに「キャッチ」を使用しての、あなたも使用できる「情報を存在」:

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

ありがとうございます!これは私のために働いた。 –

+0

'-def'オプションはありません。 'tclsh'はできるだけスクリプトから離れることを好みます。 –

0

あなたがスクリプトを中断からエラーを防ぐために、あなたのコマンドをcatchすることができます。

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

(警告:TCLインタプリタで正確な構文をチェックしていませんでした。上記のスクリプトはアイデアを伝えるだけです)。

1

別の方法としては、tcllibからCMDLINEパッケージのようなものを使用することができます。これにより、バイナリフラグと名前/値引数のデフォルトを設定し、フォーマットされたヘルプメッセージを表示できるように説明を与えることができます。これは名前です.argサフィックスが示す

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} 

:あなたは出力を圧縮するために、入力ファイル名、および必要に応じて出力ファイル名とバイナリオプションを必要とするプログラムを持っている場合たとえば、あなたはのようなものを使用する場合があります/値のペアの引数、もしそれがリストされていなければ、バイナリフラグであると仮定します。

関連する問題