コマンドラインからprocの引数を渡す方法はありますか?スクリプトにprocがあります。コマンドラインから引数を与えたいと思います。シェルスクリプトに「$@」のような同等のコマンドはありますか?
3 に答える
これらの事前定義された変数を使用して、コマンドライン引数を取得できます。
$argc - number items of arguments passed to a script.
$argv - list of the arguments.
$argv0 - name of the script.
コマンドライン引数には多くの部分があります。
$argv
—「有用な」引数ワードのTclリスト。スクリプトの名前を除外します。$argc
—「有用な」引数の単語の数(つまり、の長さ$argv
);[llength $argv]
同様に機能することを考えると、ほとんど使用されません。$argv0
—実行されているメインスクリプトの名前。[info nameofexecutable]
—スクリプトを実行しているプログラム。しばしばtclsh
orwish
(またはバージョン番号と拡張機能を使用したバリエーション)と呼ばれますが、必ずしもそうとは限りません。
すべての「有用な」引数ワード(通常は引数と見なされるすべてのワード)をプロシージャに渡す最も簡単な方法は、これを行うことです(Tcl 8.5以降を想定)。
theProc {*}$argv
これは、へのすべての呼び出しが行われた後に行われる必要があることに注意してくださいproc
。proc
プロシージャの宣言ではなく、プロシージャを定義するコマンドです。(違いは?宣言はファイルのさらに上に表示される可能性がありますが、Tclはそのようには機能しません。)
スタックトレースをダンプする代わりにエラーを適切に報告できるように、上記を本番コードの例外処理でラップすることがよくあります。
if {[catch {theProc {*}$argv} msg]} {
handleError $msg
}
8.5より前は、もっと醜い方法が必要でした。
eval theProc $argv
$argv
Tclがリスト値の作成を保証する方法と、適切なリストであることがわかっているため、これは(正式な意味で)依然として安全です。
args
可変数の引数もあります。
proc foo args {
foreach arg $args {
puts "arg=$arg"
}
}
したがって、fooを呼び出すと、次のように出力されます。
% foo 1
arg=1
% foo 1 2 3
arg=1
arg=2
arg=3
%
$ argvを使用してこのプロシージャを呼び出すと、$argvのコンテンツ全体が$argcリスト内の単一の要素として扱われることに注意してください。
$ cat ar.tcl
#!/usr/bin/tclsh
proc foo args {
foreach arg $args {
puts "arg=$arg"
}
}
foo $argv
$
$ ./ar.tcl 1 2 3
arg=1 2 3
[lindex $args 0]
あなたは本物を手に入れるために使う必要があるでしょう$argv