2012-11-30 238 views
1

有沒有辦法從命令行傳遞一個proc參數?我的腳本中有我的過程。我想從命令行給出它的參數。在shell腳本中是否有像「$ @」這樣的等價命令?TCL中的proc參數

回答

4

您可以使用這些預定義的變量獲取命令行參數。

$argc - number items of arguments passed to a script. 
$argv - list of the arguments. 
$argv0 - name of the script. 
0

也有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]才能得到真實的

4

命令行參數有很多部分:

  • - Tcl「有用」參數詞列表。排除腳本的名稱。
  • $argc - 「有用」參數詞的數量(即,長度爲);因爲[llength $argv]的作用也很好,所以很少使用。
  • $argv0 - 正在執行的主腳本的名稱。
  • [info nameofexecutable] - 執行腳本的程序。通常稱爲tclshwish(或與版本號和擴展名有所不同),但絕對不一定如此。

通過了所有「有用」的說法的話,最簡單的方式 - 所有你通常所認爲的是參數的話 - 的過程是這樣做(假設Tcl的8.5或更高版本):

theProc {*}$argv 

請注意,這個必須在之後所有調用proc完成; proc是定義過程的命令,而不是過程的聲明。 (這個區別?聲明可以被看作是文件的更深層次,但Tcl並不是這樣工作的。)

我經常喜歡在生產代碼中包裝一些異常處理,以便任何錯誤都可以很好地報道,而不是傾銷堆棧跟蹤:

if {[catch {theProc {*}$argv} msg]} { 
    handleError $msg 
} 

此前8.5,你需要一個更醜陋的方式:

eval theProc $argv 

這仍然是安全的(正式意義上的),因爲Tcl如何保證構造列表值,以及我們知道是一個適當的列表。