【轉】TCL語法簡介


1,腳本構成

 

 

 

set a 2
set b 3
//
set a 2;set b 3

 

TCL腳本可以包括多個命令,命令間使用換行符或者分號分開,一個命令使用空格分開命令、變量等其他參數。

 

2,置換

 

  • 變量置換

 

  

 

set c $a+$b //c = a+b=2+3

 

使用美元符號$進行變量置換,上式中c=2+3而不是5,要讓c=5需要使用命令置換。

 

  • 命令置換

 

  

 

set c [expr $a+$b]

 

當使用[]時,括號內第一個字符會當做命令,后續的作為命令參數,expr命令用於進行表達式求值。對求值結果進行返回並賦值給c。

 

  • 反斜杠\置換

 

\使得特殊字符失去特殊含義

 

set msg money\ \$3333

 

使用使用\,上述空格不會被當做命令間字符分割處理,$也不會當做變量置換。

 

  • 雙引號“”與花括號{}

 

使用雙引號“”和花括號{}也可以使得解釋器將分隔符置換符等特殊字符當做普通字符。“”只是對分割符不處理,對換行符、變量置換$、命令置換依然會處理

 

set y "$a xxx" //y -> 2 xxx

 

使用花括號所有特殊字符都變成普通字符

 

set y {/n$x [expr 10 +100]} //y->/n$x [expr 10 +100] 

 

3,注釋

 

行首的‘#’符開始表示該行為注釋。'#'必須出現在TCL解釋器期望命令的第一個字符。因此'#'出現在行首及';'后后面內容才能當做注釋。

 

# this is a comment
set msg "hello world!" ;#this is another comment
set msg2 "nice day!" #error,this is not a comment

 

4,變量

 

TCL變量由名字和值構成,名字和值均可以是任意字符。要注意的是‘$’進行變量置換時是值得第一個不是字母、數字、下划線的字符之間的單詞符號作為被置換變量名。使用set命令來設置變量,unset 命令取消變量。

 

復制代碼
set a 2
set a.1 4
set b $a.1
set c ${a.1}
# b=2.1;c=4
復制代碼

 

TCL的數組有點向python的字典,數組下標可以是任意字符串。

 

set day(monday) 1
set day(tuesday) 2
set b $day(monday);#b=1

 

unset刪除變量

 

unset a b day

 

5,表達式
TCL支持和C語言類似的運算符,和C類似的操作數,0777//八進制,0xff//16進制,8e10//8的10次方,和C語言一樣,TCL也內置了很多數學函數。

 

6,列表list

 

列表是TCL重要的數據結構。list表示一堆元素的集合,元素可以是任意字符,包括list。

 

{}
{1 2 3 4 5}
{1 23 3 {4 5}}

 

1)list使用list命令生成列表,list 1 2 3 4

 

2)使用concat list list...合並兩個或多個列表

 

3)lindex list index 返回list第index個元素,從0開始計算。

 

4)llength list 返回list的元素個數

 

5)linsert list index value value...返回新list,新list是把所有value插入到list第index個元素之前

 

6)lreplace list first last value value...返回新list,把list第first個到last個元素用value參數替換,沒有value參數則表示刪除。

 

7)lrange list first last 返回list第first到last個元素組成的串。last 為end則返回到串末

 

8)lappend varname value value 把每個value附加到varname后面。

 

9)lsearch -exact -glob -regexp list pattern 返回第一個匹配的元素索引,找不到則返回-1。-exact、-glob、-regexp是可選的3中模式匹配技術。

 

-exact表示精確匹配;-glob和string match命令的匹配方式相同,-regexp表示正規表達式匹配。

 

10)lsort options list 對list排序,通過options指定排序方式,有-ascii:缺省方式,按照ASCII字符順序排序,-dictionary,按照字典順序,字典順序不考慮大小寫,數字被當做整數排序。-integer,將list元素轉換成整數,按照整數排序,-real,轉換成浮點數排序;-increasing升序,-decreasing降序。-command cmd 按照cmd命令對元素一一比較后給出排序結果。

 

11)split string splitchar 按照splitchar對string進行分割,返回分割后的list

 

12)join list joinstring 將list元素合並到字符串,中間以joinstring分開,缺省joinstring為空格。

 

7,控制流

 

和c語言類似,支持常見的控制流,if,switch,while,for,foreach。foreach 可以對list進行很好的遍歷。

 

復制代碼
if {$x>0}{
    do_something;
}elseif{$x==0} {

...
}else{
    do_anotherthing;
}
    
復制代碼

 

使用{}對語句塊進行分割以及條件表達式測試,第一行最后的{必須放在上一行,否則TCL會認為if命令已經結束,而將行首的{當做命令從而導致錯誤。

 

'if {$x>0}'if與{間有空格。

 

switch options string {pattern body pattern body} //options可以指定匹配方式-exact,-glob(default),-regexp

 

復制代碼
switch $x {
a -
b {incr t1}
c {incr t2}
default {incr t3}
}
復制代碼

 

while test body

 

復制代碼
set i [expr [llength $a] -1]
while { $i>=0}{
lappend b [lindex $a $i]
incr i -1
} 
復制代碼

 

for init test reinit body

 

for {set i [expr [llength $a] -1]} {$i>=0} {incr i -1} {
lappend b [lindex $a $i] }

 

foreach varnem list body

 

set x {}
foreach {i j} {a b c d e f} {
lappend x $j $i
} 

 

和C類似,TCL提供了break,continue命令用於跳出循環。
source命令,TCL提供source命令來調用和執行其他的tcl腳本,source /home/xxx/scripts/scripts1001.tcl

 

8,函數定義

 

TCL使用過程proc來進行C類似的函數定義,使用proc可以實現一些自定義的命令,其用法和內置命令一樣。

 

proc add {x y } {expr $x+$y}
add 1 2 ;# result is 3

 

proc內部可以使用global聲明一個全局變量,即該變量在proc體外定義,聲明global后,可以在proc內部對全局變量進行訪問。
應用upvar,使用upvar實現對一個變量的引用,upvar othervar myvar,一旦實現引用的綁定,對myvar的修改都將對應到othervar上去。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM