1、TCL指令碼基本語法(概要)
TCL常用基本語法
一個TCL指令碼可以包含一個或多個命令。命令之間必須用換行符或分號隔開。
第一個單詞代表命令名,另外的單詞則是這個命令的引數,用空格或TAB鍵隔開。
變數置換$。
命令置換[]
反斜槓置換\ ,例如set msg multiple\ space ,如果沒有\則有報警。
雙引號將各種分隔符將不作處理,對換行符及$和[]兩種置換符會照常處理。
花括號中所有特殊字元成為普通字元,失去其意義。
註釋符 ‘#’
$符號往後直到第一個不是字母、數字或下劃線的字元之間的單詞符號作為要被置換的變數的名字。
(bin) 28 % set a.1 2
2
(bin) 29 % set b $a.1
1.1
(bin) 30 % set b ${a.1}
2
陣列如下:
(bin) 31 % set day(1) 1
1
(bin) 32 % set day(2) 2
2
TCL不能支援複雜的資料型別,不過擴充套件ITCL填補了這個缺憾。
unset命令可以刪除變數。
6/58
字串
append將文字加到一個變數的後面
incr命令把變數值加上一個整數。
TCL表示式運算元是整數或實數。0開頭表示八進位制,0X開頭表示十六進位制
支援加減乘除,移位等操作。
此外expr是TCP的一個命令,
list在TCL中表示集合,可以巢狀定義。
concat命令,把多個list合成一個list.
lindex返回list的第index個0-based元素
llength返回list的元素個數。
linsert返回一個新串,把所有的value引數值插入list的第index個元素之前
lreplace替換第first到第last個元素所有的value引數。
lrange返回list的第first到第last元素組成的串。如果last為end表示到串的最後。
lappend將value值作為一個元素附加到變數varname後面,並返回變數的新值
lsearch返回list中第一個匹配模式pattern的元素的索引,找不到匹配就返回-1.-exact,-glob,-regexp是三種匹配。-exact表示精確匹配,-glob和string match命令匹配方式相同。-regexp表示正規表示式匹配。
lsort這個命令返回把list排序後的串。
Split把string按分隔符splitChars分成一個個單詞。例如split “how.are.you” .
Join是命令的逆。把所有元素合併到一個字串中,中間以joinString分開。
字串操作
format格式化類似sprintf函式
set msg [format "%s is %d yearsold" $name $age];
scan命令式format命令的逆,類似於sscanf函式。
regexp用於判斷正規表示式exp是否全部或部分匹配字串string,匹配返回1,否則0.
resub命令第一個引數是一個整個表示式,第二個引數是一個輸入字串,這一點和regexp命令完全一樣。匹配返回1,否則返回0,不過regsub用第三個引數來替換字串string中和正規表示式匹配的部分,第四個引數被認為是一個變數,替換後的字串存入這個變數中。
String命令具有強大的操作字串的功能,其中option選項多達20個。
控制流:
If後面的{一定要寫在上一行,如果不這樣TCL直譯器會認為if命令在換行符處已結束,下一行會被當成新的命令,從而導致錯誤的結果。此外if和{之間需要有個空格,否則TCL會把if{當成一個整體,從而導致錯誤。
whiletest body
Test是一個表示式,body是一個指令碼,如果表示式的值非0,就執行指令碼,直到表示式為0才停止迴圈。
forinit test reinit body
引數init是一個初始化指令碼,第二個引數test是一個表示式,用來決定迴圈什麼時候中斷,第三個引數reinit是一個重新初始化的指令碼,第四個引數body也是指令碼,代表迴圈體。
Foreach命令有兩種語法形式
第一種:foreachvarName list body
第二種:foreachvarlist1 list1 ?varlist2 list2 ..? Body
TCL支援switch命令,支援三種匹配方式:-exact,-glob,-regexp方式
預設是-glob方式。-regexp是正規表示式的匹配方式。
檔案
eval可以接收一個或多個引數,然後把所有的引數以空格隔開組合到一起成為一個指令碼,然後對這個指令碼進行求值。
source命令讀一個檔案並把這個檔案的內容作為一個指令碼進行求值。
Open命令以access方式開啟檔案. Open命令返回一個字串用於表識開啟的檔案。TCL有三個特定的檔案標識:stdin,stdout,stderr.對應標準輸入、標準輸出和錯誤通道。
Gets讀fileid標識的檔案下一行,忽略換行符。
Gets類似的命令是read,不過read不是一行為單位。
Puts把string寫到fileid中。
Flush把緩衝區內容寫到filed標識的檔案中。
Close關閉標識為filedid的檔案。
Tcl提供了seek,tell和eof等命令使使用者可以非連續訪問檔案。
TCL提供pwd和cd命令來管理當前工作目錄。
檔案操作的第二個命令式file,file有許多選項的常用命令,可以用來進行檔案操作也可以檢索檔案資訊。
過程
Proc命令的第一個引數是你要定義的過程的名字,第二個引數是過程的引數列表,引數之間用空格隔開。
proc add {x y} {expr $x+$y}
定義過程時,可以使用return命令在任何地方返回想要的值。
TCL提供三種特殊的引數形式:
upvar命令使得使用者可以在過程中對全域性變數或其他過程中的區域性變數進行訪問。
可以理解成繫結變數。
錯誤異常
異常是導致指令碼被終止的事件。
很多情況下,錯誤資訊提供了足夠的資訊指出哪裡以及為什麼發生了錯誤。如果錯誤發生在一組深層套嵌的過程呼叫中,僅僅給出錯誤資訊還不能為指出哪裡發生了錯誤提供足夠資訊。為了幫助指出錯誤的位置,當TCL撤銷程式中執行的命令時,建立了一個跟蹤棧,並且把這些跟蹤棧儲存到全域性變數errorInfo中。
Catch命令可以俘獲所有的異常,不僅是錯誤。Catch命令的返回值表示是那種情況的異常。
深入
利用array命令可以查詢一個數組變數中已經定義了的元素的資訊。
Info命令提供了檢視TCL直譯器資訊的手段,有超過一打的選項。
例如info exist a
info global
tcl命令提供了trace命令來跟蹤一個或多個變數。