0

コマンドライン呼び出しで変数を定義することによって実行されるTclスクリプトがいくつかあります。

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

コマンドラインでvar1とvar2が定義されていないかどうかを確認し、それらに一連のデフォルト値を割り当てる方法はありますか?

キーワードglobal、variable、setを試しましたが、次のように言うと、これらすべてでこのエラーが発生します"if {$<var1>==""}""can't read <var1>: no such variable"

4

3 に答える 3

5

私はtclshの-defオプションに精通していません。

ただし、変数が設定されているかどうかを確認するには、「catch」を使用する代わりに、「infoexist」を使用することもできます。

if { ![info exists blah] } {
  set blah default_value
}
于 2009-05-11T09:47:32.563 に答える
1

または、tcllibのcmdlineパッケージのようなものを使用することもできます。これにより、バイナリフラグと名前/値引数のデフォルトを設定し、それらに説明を付けて、フォーマットされたヘルプメッセージを表示できるようにすることができます。たとえば、入力ファイル名と、オプションで出力ファイル名と出力を圧縮するためのバイナリオプションを必要とするプログラムがある場合は、次のようなものを使用できます。

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}

.argサフィックスは、これが名前と値のペアの引数であることを示します。リストされていない場合は、バイナリフラグであると見なされます。

于 2009-05-11T15:14:14.303 に答える
0

catchエラーがスクリプトを中止するのを防ぐためにコマンドを実行できます。

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

(警告:TCLインタープリターで正確な構文を確認していません。上記のスクリプトは、アイデアを提供するためのものです)。

于 2009-05-11T09:31:23.557 に答える