收藏 分享(赏)

TCL脚本语言.doc

上传人:hwpkd79526 文档编号:7135864 上传时间:2019-05-07 格式:DOC 页数:62 大小:678KB
下载 相关 举报
TCL脚本语言.doc_第1页
第1页 / 共62页
TCL脚本语言.doc_第2页
第2页 / 共62页
TCL脚本语言.doc_第3页
第3页 / 共62页
TCL脚本语言.doc_第4页
第4页 / 共62页
TCL脚本语言.doc_第5页
第5页 / 共62页
点击查看更多>>
资源描述

1、系统学习 TCL 脚本入门教程 版本:1. 0第 2 页 共 62 页 目 录1 TCL 语法 41.1 简介 .41.2 运行环境 .41.3 本文约定 .41.4 参考资料 .42 引言 .52.1 第 1 课:简单文本输出 .52.2 第 2 课:给变量赋值 .52.3 第 3 课:命令的赋值与置换一 .62.4 第 4 课:命令的赋值与置换二 .72.5 第 5 课:命令的赋值与置换三 .72.6 第 6 课:算数运算 .82.7 第 7 课:文本比较SWITCH 应用 .92.8 第 8 课:数值比较IF 应用 102.9 第 9 课:WHILE 循环 112.10 第 10 课:F

2、OR 循环和 INCR .112.11 第 11 课:过程 PROC .122.12 第 12 课:过程 PROC 的参数定义 132.13 第 13 课:变量的作用域 .132.14 第 14 课:LIST 结构 .142.15 第 15 课:LIST 项的增删改 .152.16 第 16 课:更多 LIST 相关 162.17 第 17 课:字符串函数 .172.18 第 18 课:更多字符串函数 .172.19 第 19 课:修改字符串函数 .192.20 第 20 课:正则表达式 .212.21 第 21 课:更多正则表达式 .222.22 第 22 课:数组 .242.23 第 23

3、 课:更多数组相关 .252.24 第 24 课:文件存取 .282.25 第 25 课:文件信息 .302.26 第 26 课:TCL 中的子进程调用OPEN # ,在命令后注释用 ;# ,在行开头两者均可;2 puts :输出文本,多个单词如被空格或 TAB 分隔需要使用“”或 括起来;3 多个命令写在一行使用 ; 间隔。例子:002_puts.tcl# ok ;# 正确;# ok ;# 正确; # ok ;# 正确, 分号和井号之间可以有空格puts Hello ;# 正确puts Hello,World ;# 正确,多个单词之间不是被空格或者 TAB 分隔开puts Hello Wor

4、ld ;# 这行命令运行出错,被空格分隔puts “Hello, World - In quotes“ ;# 注释puts Hello, World - In Braces # 这行命令运行出错,必须使用 ;# 作为注释符号puts “This is line 1“; puts “this is line 2“ ;# 正确,用分号分隔两个命令puts “Hello, World; - With a semicolon inside the quotes“ ;#正确,分号在双引号内,作为字符串一部分2.2 第 2 课:给变量赋值讲解:1 set:给变量赋值,格式为 set var value例子

5、:003_var.tcl;# 给变量 X 赋一个字符串set X “This is a string“;# 给变量 Y 赋一个数字set Y 1.24;# 显示 X 和 Y 的内容puts $Xputs $Y;# 打印一个分隔串puts “.“第 6 页 共 62 页 ;# 打印在一行中,推荐使用双引号set label “The value in Y is: “puts “$label $Y“puts $label$Y2.3 第 3 课:命令的赋值与置换一讲解:1 TCL 中命令的赋值分为置换和赋值两个步骤2 续行符为 3 转义符同为 4 特殊字符列表:序号 字符 输出 十六进制1 a 响铃

6、 x072 b 回车 x083 f 清屏 x0c4 n 换行 x0a5 r 回车 x0d6 t 制表符 x097 v 垂直制表符(Vertical Tab) x0b8 ddd 八进制值 d=0-79 xhh 十六进制值 h=0-9,A-F,a-f例子:004_eval.tcl;# Show how a affects the $set Z “Albany“set Z_LABEL “The Capitol of New York is: “puts “$Z_LABEL $Z“ ;#显示 Albanyputs “$Z_LABEL $Z“ ;#显示$Z,被 转义;# The next line ne

7、eds a backslash to escape the $puts “nBen Franklin is on the $100.00 bill“ ;# n 换行; $100 前的 必须有,否则会将 100 作为一个变量,提示出错set a 100.00puts “Washington is not on the $a bill“ ;# This is not what you wantputs “Lincoln is not on the $a bill“ ;# 显示$100,说明是后结合的,先置换了$a,此处严格的写应该写为 $aputs “Hamilton is not on the

8、$a bill“ ;# 显示$aputs “Ben Franklin is on the $a bill“ ;# 显示$100,说明是后结合的,先置换了$a第 7 页 共 62 页 puts “n. examples of escape strings“puts “TabtTabtTab“puts “This string prints out non two lines“ ;# 行中 没有打印出来,如果要打印出来,需要写成 puts “This string comes outon a single line“ ;# 当一行太长,不便于阅读,使用 做续行符2.4 第 4 课:命令的赋值与置换

9、二讲解:1最外层是 则不会进行置换操作,但其中的续行符仍然有效例子:005_escape.tclset Z “Albany“set Z_LABEL “The Capitol of New York is: “puts “n. examples of differences between “ and “ ;#and 前的双引号前必须有 进行转义,否则这个双引号回和前面的双引号结合, 导致成了 “xxx” and “ 的结构,会提示出错puts “$Z_LABEL $Z“ ;# 显示 The Capitol of New York is: Albanyputs $Z_LABEL $Z ;# 显示

10、 $Z_LABEL $Z,没有进行置换, 中不会置换puts “n. examples of differences in nesting and “ “puts “$Z_LABEL $Z“ ;# 最外层是双引号,所以进行了置换puts Who said, “What this country needs is a good $Z cigar!“? ;#最外层是花括号,所以没有进行置换puts “n. examples of escape strings“puts There are no substitutions done within braces n r x0a f v ;#puts

11、But, the escaped newline at the end of astring is still evaluated as a space ;#续行符仍然生效2.5 第 5 课:命令的赋值与置换三讲解:1 可以传递其中的命令结果,注意不能被 包含;2 双引号包含的 中的命令可以正常执行,命令结果也可以传出;3 包含的 中的命令不会执行,更不会有命令结果传出来。例子:006_escape.tclset x “abc“puts “A simple substitution: $xn“ ;#显示 abc第 8 页 共 62 页 set y set x “def“ ;#先执行 中的命令,

12、将”def” 赋值给 x,然后将该命令的结果赋值给 yputs “Remember that set returns the new value of the variable: X: $x Y: $yn“ ;#显示 x 和 y 都是 defset z set x “This is a string within quotes within braces“ ;#由于在 中,所以并没有执行对 x 的赋值,只是将 赋值给 zputs “Note the curly braces: $zn“set a “set x This is a string within braces within quot

13、es“ ;#执行了对 x 的赋值操作,并将值传出来赋给了 aputs “See how the set is executed: $a“puts “$x is: $xn“set b “set y This is a string within braces within quotes“puts “Note the escapes the bracket:n $b is: $b“puts “$y is: $y“2.6 第 6 课:算数运算讲解:1 操作符序号 操作符 解释1 - + ! - : 负号 + : 正号 : 位操作非 ! : 逻辑非2 * / % * : 乘 / : 除 % : 取模3

14、 + - + : 加 - : 减4 : 循环右移5 set Y 256 ;# 行末是否有分号都可以set Z expr “$Y + $X“ ;# 变量是否被双引号包含都可以,不过建议使用双引号set Z expr $Y + $Xset Z_LABEL “$Y plus $X is “puts “$Z_LABEL $Z“puts “The square root of $Y is expr sqrt($Y)n“puts “Because of the precedence rules “5 + -3 * 4“ is: expr -3 * 4 + 5“puts “Because of the pa

15、rentheses “(5 + -3) * 4“ is: expr (5 + -3) * 4“puts “n. more examples of differences between “ and “puts $Z_LABEL expr $Y + $X ;#外层是花括号不会进行置换puts “$Z_LABEL expr $Y + $X“ ;# 外层是双引号会进行置换puts “The command to add two numbers is: expr $a + $b“2.7 第 7 课:文本比较SWITCH 应用讲解:1 switch 的分支中的命令使用花括号包含,但是并不会影响花括号中的

16、命令执行,切记,这是switch 的格式;2 如果不想分支条件进行置换,需要在外加上花括号,不会影响分支中的命令执行。例子:008_switch.tcl;# Set the variables well be comparingset x “ONE“;set y 1;set z “ONE“;# This is legalswitch $x “ONE“ “puts ONE=1“ “TWO“ “puts TWO=2“ “default“ “puts NO_MATCH“ ;#这种写法合法,但是阅读不便switch $x “ONE“ “puts ONE=1“ “TWO“ “puts TWO=2“ “d

17、efault“ “puts NO_MATCH“ ;#这种写法好看一些,推荐第 10 页 共 62 页 ;#下面这种写法$z 被置换,走入$z 的条件分支,表面上看条件分支中的命令在花括号内,这只是 switch 的一种格式,所以其中的命令仍然被执行了。switch $x “$z“ set y1 expr $y+1; puts “MATCH $z. $y + $z is $y1“ “ONE“ set y1 expr $y+1; puts “MATCH ONE. $y + one is $y1“ “TWO“ set y1 expr $y+2; puts “MATCH TWO. $y + two i

18、s $y1“ “THREE“ set y1 expr $y+3; puts “MATCH THREE. $y + three is $y1“ “default“ puts “$x does not match any of these choices“;# This form of the command disables variable substitution in the pattern;#下面为了不置换$z, 在外层加上了花括号,于是走入了 ONE 分支,而分支中的命令仍然被执行了switch $x “$z“ set y1 expr $y+1; puts “MATCH $z. $y

19、+ $z is $y1“ “ONE“ set y1 expr $y+1; puts “MATCH ONE. $y + one is $y1“TWO“ set y1 expr $y+2; puts “MATCH TWO. $y + two is $y1“THREE“ set y1 expr $y+3; puts “MATCH THREE. $y + three is $y1“default“ puts “$x is NOT A MATCH“2.8 第 8 课:数值比较IF 应用讲解:1 条件式结果FALSE TRUE数值 0 非零yes / no no yestrue / false false

20、 true2置换变量的方法,set y x ; puts $y ,因为是后结合并且是一次置换,所以打出来的是 $x ,不是$x 的值;但是在 if 的条件式中进行了二次置换, $y 被置换成了 $x 的值3注意:新行中需要写为 else ,不能将 写到前一行的末尾,也不能省略 后面的那个空格,后面的 也需要写在当行,并且前面需要一个空格。例子:009_if.tclset x 1;if $x = 2 puts “$x is 2“ else puts “$x is not 2“ ;#判断是否相等使用 =if $x != 1 ;#判断是否不等使用 !=puts “$x is != 1“ else p

21、uts “$x is 1“第 11 页 共 62 页 if $x=1 puts “GOT 1“set y x;if “$y != 1“ ;#在 if 条件式中$y 进行了二次置换puts “$y is != 1“ ;#在 puts 命令中,只进行了一次置换 else puts “$y is 1“2.9 第 9 课:WHILE 循环x 讲解:1while 后面的条件表达式是放在花括号中的;放在双引号中会只执行一次置换例子:010_while.tclset x 1;while $x 6 break; ;#如果去掉这句就成了死循环if “$x 3“ continue; ;#这句使 4 打不出来put

22、s “x is $x“; puts “exited second loop with X equal to $xn“2.10第 10 课:FOR 循环和 incr讲解:1incr x 和 set x expr $x + 1 达到一样的效果,向上加一x例子:011_for.tclfor puts “Start“; set i 0 $i = 0 puts “$name starts with a lowercase lettern“ else puts “$name starts with an uppercase lettern“;#说明 string wordstart 和 string wo

23、rdendset word “1 12 123“;# 1 的开始和结束位置,返回: 0 和 1puts “wordstart : string wordstart $word 0“puts “wordend : string wordend $word 0“;# 位置 1 上的空格的开始和结束位置,返回: 1 和 2puts “wordstart : string wordstart $word 1“puts “wordend : string wordend $word 1“;# 位置 2 上所在单词 12 的开始和结束位置,返回: 2 和 4puts “wordstart : string

24、 wordstart $word 2“puts “wordend : string wordend $word 2“;# 位置 5 上所在单词 123 的开始和结束位置,返回: 5 和 8puts “wordstart : string wordstart $word 5“puts “wordend : string wordend $word 5“;# 位置 6 上所在单词 123 的开始和结束位置,返回: 5 和 8puts “wordstart : string wordstart $word 6“puts “wordend : string wordend $word 6“第 20 页

25、 共 62 页 2.19第 19 课:修改字符串函数讲解:1 字符串函数序号 函数 解释1 string tolower string1 把 string1 转换为小写字母2 string toupper string1 把 string1 转换为大写字母3 string trim string1 ? trimchars ? 去掉 string1 前后的 trimchars 字符,如果不指定,缺省为空格,trimleft 和 trimright 一样的情况4 string trimleft string1? trimchars ? 去掉 string1 左边的 trimchars 字符5 st

26、ring trimright string1? trimchars ? 去掉 string1 右边的 trimchars 字符2 format 函数格式:format formatstring ?arg1 arg2 . argn ?注意是 format,不是 string format格式串列表:序号 格式 描述1 s 字符串2 d 十进制整数3 x 十六进制数值4 o 八进制数值5 f 浮点数6 - 左对齐7 + 右对齐,不指定 或 + ,缺省是右对齐例子:020_stringmodify.tclset upper “THIS IS A STRING IN UPPER CASE LETTER

27、S“set lower “this is a string in lower case letters“set trailer “This string has trailing dots “set leader “This string has leading dots“set both “(this string is nested in parens )“puts “tolower converts this: $upper“puts “ to this: string tolower $uppern“puts “toupper converts this: $lower“puts “

28、to this: string toupper $lowern“puts “trimright converts this: $trailer“puts “ to this: string trimright $trailer .n“第 21 页 共 62 页 puts “trimleft converts this: $leader“puts “ to this: string trimleft $leader .n“puts “trim converts this: $both“puts “ to this: string trim $both “()“n“set a “ trim “pu

29、ts “string trim $a“ ;#返回 trim,说明缺省是去掉的空格set labels format “%-20s %+10s “ “Item“ “Cost“ ;# %-20s:总长度 20,字符串左对齐set price1 format “%-20s %10d Cents Each“ “Tomatoes“ “30“ ;# %10d:总长度 10,数值右对齐set price2 format “%-20s %10d Cents Each“ “Peppers“ “20“set price3 format “%-20s %10d Cents Each“ “Onions“ “10“se

30、t price4 format “%-20s %10.2f per Lb.“ “Steak“ “3.59997“ ;#%10.2f:总长度 10,小数点后两位,数值右对齐puts “n Example of format:n“puts “$labels“puts “$price1“puts “$price2“puts “$price3“puts “$price4“2.20第 20 课:正则表达式讲解:1 利用正则表达式在字符串中查找子串格式:regexp ?switches?exp string1?matchVar? ?subMatch1 . subMatchN?例如:regexp (A-Za

31、-z+) +(a-z+) $sample match sub1 sub2 switches exp :正则表达式,使用 包含,如果使用”包含,需要转义符才能执行 $sample :被查找的字符串 match:满足(A-Za-z+) +(a-z+) 匹配的子串传递给 match sub1:满足(A-Za-z+)的子串传递给 sub1,正则表达式中圆括号的匹配项会将结果按顺序传递给后面的变量 sub2:满足(a-z+)的子串传递给 sub2,正则表达式中圆括号的匹配项会将结果按顺序传递给后面的变量2 利用正则表达式在字符串中替换子串格式:regsub ?switches? exp string1

32、subSpec VarName例如:regsub “way“ $sample “lawsuit“ sample2switches exp:正则表达式,此处是字符串“way“string1:被替换的字符串第 22 页 共 62 页 subSpec:替换为什么字符串,此处是 “lawsuit“VarName:替换后的结构赋给的变量注意:只替换一次。3 正则表达式常用通配符列表序号 通配符 描述1 匹配一个字符串的开头2 $ 匹配一个字符串的结尾3 . 匹配任意一个字符4 * 匹配 0 到 n 个任意字符5 + 匹配 1 到 n 个任意字符6 . 匹配一个字符集合,例如:a-z代表匹配所有小写字母7

33、 . 匹配不包括该集合,例如:a-z代表匹配所有非小写字母8 (.) 圆括号会将其中的正则表达式的匹配项传递给后面的变量例子:021_regular.tclset sample “Where there is a will, There is a way.“set result regexp a-z+ $sample matchputs “Result: $result match: $match“ ;#返回 hereset result regexp (A-Za-z+) +(a-z+) $sample match sub1 sub2 puts “Result: $result Match:

34、$match 1: $sub1 2: $sub2“ ;#sub1=Where, sub2=thereset result regexp (A-Za-z+)( +)(a-z+) $sample match sub1 sub2 sub3puts “Result: $result Match: $match 1: $sub1 2: $sub2 3: $sub3“ ;#返回的结果为:sub1=Where,sub2是一个空格,sub3=there 。说明加上圆括号就能将匹配子串传递给后面的变量regsub “way“ $sample “lawsuit“ sample2puts “New: $sample

35、2“set sample “Where there is a will, There is a way way.“regsub “way“ $sample “lawsuit“ sample2puts “New: $sample2“ ;#返回结果: There is a lawsuit way. 可以看出只是替换了左边的一个way2.21第 21 课:更多正则表达式讲解:第 23 页 共 62 页 正则表达式非常重要,虽然已经有正则表达式的工业标准,但是实际情况并不完全统一,perl,shell,tcl ,java 等的正则表达式都有些许区别,所以大家需要留心细节。1 * :0 到 n 个非零字

36、符2 * :0 到 n 个零30-9+ :1 到 n 个数字4/* :0 到 n 个非反斜杠字符5(/a-z*) :前面是一个反斜杠,后面跟着 0 到 n 个小写字母6(t+) :非制表符的任意字符7(t) :一个制表符8 :其实是匹配的 ,因为书写的时候需要转义符例子:set list1 list /dev/wd0a 17086 10958 5272 68% /dev/wd0f 179824 127798 48428 73% /news/dev/wd0h 1249244 967818 218962 82% /usr/dev/wd0g 98190 32836 60444 35% /varfor

37、each line $list1 regexp * *(0-9+)/*(/a-z*) $line match size mounted;puts “$mounted is $size blocks“# get every field valueregexp ( *) $line match first;regexp * *(0-9*) $line match first;regexp * *0-9* *(0-9*) $line match first;regexp * *0-9* *0-9* *0-9* *(0-9*%) $line match first;regexp * *0-9* *0-

38、9* *0-9* *0-9*% *(/a-z*) $line match first;regexp (/a-z*)$ $line match first;puts “$first“;# get two numberregexp .(.0-9*).a “3343a“ match ss;puts “$ss“set line Interrupt Vector? 32(0x20)regexp “t+t0-9+(0x(0-9a-fA-F+)“ $line match hexval ;#看得人头晕,建议各位还是用花括号吧puts “Hex Default is: 0x$hexval“set str2 “a

39、bcdef“regexp “a-f*def“ $str2 match第 24 页 共 62 页 regexp a-z*a-z*$ $str2 matchputs “using a-f the match is: $match“regexp “a-f*def“ $str2 matchregexp a-f*def $str2 matchputs “using a-f the match is: $match“regsub $str2 “ is followed by: “ str3puts “$str2 with the substituted is: “$str3“regsub “(a-f+)(

40、a-f+)“ $str2 “2 follows 1“ str3puts “$str2 is converted to “$str3“注意:1()和的区别(ab) 代表的是 ab 串,也就是说 ab 是有顺序的ab 代表的是 a,b 等,代表的是不确定的数个字符,没有顺序问题2a-z 代表的是非 a-z 的任意字符a-z 代表的是 a-z 及 字符,此处的 不代表非的意思,它和 a,b,c 一样是个单独的字符3a-z* 和 (a-z*) 的区别 :例子:regexp (0-9*) “333“ match ss;puts “$ss“ ;#有括号才有返回 ,没有括号就没有返回2.22第 22 课:数

41、组讲解:1数组相关命令序号 命令 描述1 array exists arrayName 判断一个数组是否存在,数组存在返回 1,数组不存在返回 02 array names arrayName ?pattern 返回一个数组的指示列表,相当于数组的第一维,如果没有匹配串则完全返回3 array size arrayName 返回数组的列数,相当于数组的第二维数目4 array get arrayName 取得数组的值列表,它使数组的赋值变得简单,例如:array set arrayX array get arrayY ,实现了将 arrayY 赋值给 arrayX5 array set arr

42、ayName datalist 数组定义第 25 页 共 62 页 例子:023_array.tclarray set array1 list 123 Abigail Aardvark 234 Bob Baboon 345 Cathy Coyote 456 Daniel Dog puts “Array1 has array size array1 entriesn“puts “Array1 has the following entries: n array names array1 n“puts “ID Number 123 belongs to $array1(123)n“set arra

43、y1(123) modifiedset array1(123) “modified“puts “ID Number 123 belongs to $array1(123)n“array set array3 array get array1 ;#可以看出 tcl 中的数组赋值非常简单,不用写循环来赋值puts “Array3 has array size array3 entriesn“puts “Array3 has the following entries: n array names array3 n“puts “Array3 has the following entries whi

44、le using pattern: n array names array3 *2* n“ ;#使用匹配串puts “ID Number 123 belongs to $array3(123)n“if array exist array1 puts “array1 is an array“ else puts “array1 is not an array“if array exist array2 puts “array2 is an array“ else puts “array2 is not an array“2.23第 23 课:更多数组相关讲解:1 使用 foreach 浏览数组内

45、容;2 使用 array startsearch,array anymore 和 array nextelement 浏览数组内容;3 数组相关函数列表:序号 函数 描述1 array startsearch arrayName 得到数组第一项,返回的是 id2 array nextelement arrayName searchID 得到数组的下一项,返回的是 id第 26 页 共 62 页 3 array anymore arrayName searchID 根据当前的 id 判断是否还有内容,返回 1 为找到,返回 0 为没有找到4 array donesearch arrayName searchID 根据 id 查找相应项,会破坏相应的状态信息4 global 和 upvar 的使用注意事项global upvar函数内 用$ 用$普通变量函数外 用$ 不用$函数内 用$ 用$数组变量函数外 不用$ 不用$解释:除了 global 普通变量函数内外都用$,其他都是函数外不用$,函数内用$。特例不考虑。下面有详细的例子例子:024_array.tclarray set array1 list 123 Abigail Aardvark 234 Bob Baboon 345 Cathy Coyote 456 Daniel Dog

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报