1、系统学习 TCL 脚本入门教程 版本:1. 0作者:次第 2 页 共 75 页 目 录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 第
2、 10 课:FOR 循环和 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 课:修改字符串函数 .202.20 第 20 课:正则表达式 .212.21 第 21 课:更多正则表达式 .222.22 第 22 课:数组 .24
3、2.23 第 23 课:更多数组相关 .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
4、Hello World ;# 这行命令运行出错,被空格分隔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 va
5、r value例子:003_var.tcl;# 给变量 X 赋一个字符串set X “This is a string“;# 给变量 Y 赋一个数字set Y 1.24;# 显示 X 和 Y 的内容puts $Xputs $Y;# 打印一个分隔串puts “.“第 6 页 共 75 页 ;# 打印在一行中,推荐使用双引号set label “The value in Y is: “puts “$label $Y“puts $label$Y2.3 第 3 课:命令的赋值与置换一讲解:1 TCL 中命令的赋值分为置换和赋值两个步骤2 续行符为 3 转义符同为 4 特殊字符列表:序号 字符 输出 十
6、六进制1 a 响铃 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 nex
7、t line needs 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 no
8、t on the $a bill“ ;# 显示$aputs “Ben Franklin is on the $a bill“ ;# 显示$100,说明是后结合的,先置换了$a第 7 页 共 75 页 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
10、 $Z ;# 显示 $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
11、v ;#puts 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 页 共 75 页 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 wi
13、thin quotes“ ;#执行了对 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 * / % * : 乘 / :
14、除 % : 取模3 + - + : 加 - : 减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
15、of the parentheses “(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
17、TWO=2“ “default“ “puts NO_MATCH“ ;#这种写法好看一些,推荐第 10 页 共 75 页 ;#下面这种写法$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. $
18、y + two is $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 “MATC
19、H $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 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 / fa
20、lse false 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 puts “$x is 1“