TCL培训教程(全)
(内部使用)
深圳市华为技术有限公司
TCL培训教程(全) 华为内部资料
目 录
1 引言 ............................................................................................................................................................. 6
2 语法 ............................................................................................................................................................. 7
2.1
2.2
脚本、命令和单词符号 ............................................................................................................... 7
置换(substitution) ......................................................................................................................... 7
2.2.1 变量置换(variable subtitution) ............................................................................................. 8
2.2.2 命令置换(command substitution) ......................................................................................... 8
2.2.3 反斜杠置换(backslash substitution) ..................................................................................... 9
2.2.4 双引号和花括号 ................................................................................................................. 10
2.3
注释 ............................................................................................................................................ 10
3 变量 ........................................................................................................................................................... 10
3.1
3.2
3.3
简单变量 .................................................................................................................................... 10
数组 ............................................................................................................................................ 11
相关命令 .................................................................................................................................... 12
3.3.1
set ........................................................................................................................................ 12
3.3.2
unset .................................................................................................................................... 12
3.3.3
append和incr ....................................................................................................................... 12
4 表达式 ....................................................................................................................................................... 13
4.1
4.2
1.1
操作数 ........................................................................................................................................ 13
运算符和优先级 ......................................................................................................................... 13
数学函数 .................................................................................................................................... 14
2 List ........................................................................................................................................................... 15
2.1
2.2
2.3
2.4
2.5
2.6
2.7
list命令 ........................................................................................................................................ 15
concat命令: ................................................................................................................................. 16
lindex命令 .................................................................................................................................. 16
llength命令 ................................................................................................................................. 16
linsert命令 .................................................................................................................................. 16
lreplace命令: ............................................................................................................................... 16
lrange 命令: ................................................................................................................................ 16
9/5/2012
版权所有,好好利用
第2页,共70页
TCL培训教程(全) 华为内部资料
2.8
2.9
2.10
2.11
2.12
lappend命令: ............................................................................................................................... 17
lsearch 命令: ............................................................................................................................... 17
lsort命令: .................................................................................................................................... 17
split命令: .................................................................................................................................... 18
join命令 ...................................................................................................................................... 18
3 控制流 ....................................................................................................................................................... 18
3.1
3.2
3.3
3.4
if命令 .......................................................................................................................................... 18
循环命令:while 、for、 foreach ............................................................................................. 19
3.2.1
while命令 ............................................................................................................................ 19
3.2.2
for命令 ................................................................................................................................ 19
3.2.3
foreach命令 ......................................................................................................................... 20
3.2.4
break和continue命令 .......................................................................................................... 20
3.2.5
switch 命令 ......................................................................................................................... 21
eval命令 ...................................................................................................................................... 21
source命令 .................................................................................................................................. 21
4 过程(procedure) ......................................................................................................................................... 21
4.1
4.2
4.3
4.4
过程定义和返回值 ..................................................................................................................... 22
局部变量和全局变量 ................................................................................................................. 22
缺省参数和可变个数参数 ......................................................................................................... 23
引用:upvar ............................................................................................................................... 24
5 字符串操作 .............................................................................................................................................. 25
5.1
5.2
5.3
1.1
1.2
format命令 .................................................................................................................................. 25
scan命令 ..................................................................................................................................... 25
regexp命令 .................................................................................................................................. 26
regsub命令 .................................................................................................................................. 28
string命令 ................................................................................................................................... 28
1.2.1
string compare ?-nocase? ?-length int? string1 string2 ................................................... 28
1.2.2
string equal ?-nocase? ?-length int? string1 string2 ..................................................... 28
1.2.3
string first string1 string2 ?startindex? ............................................................................ 29
1.2.4
string index string charIndex ........................................................................................... 29
1.2.5
string last string1 string2 ?startindex? ........................................................................ 29
1.2.6
string length string ....................................................................................................... 29
9/5/2012
版权所有,好好利用
第3页,共70页
TCL培训教程(全) 华为内部资料
1.2.7
string match ?-nocase? pattern string ............................................................................... 29
1.2.8
string range string first last ........................................................................................ 30
1.2.9
string repeat string count ............................................................................................. 30
1.2.10
string replace string first last ?newstring? ............................................................. 30
1.2.11
string tolower string ?first? ?last? .............................................................................. 30
1.2.12
string toupper string ?first? ?last? ............................................................................. 30
1.2.13
string trim string ?chars? ........................................................................................... 30
1.2.14
string trimleft string ?chars? ........................................................................................... 31
1.2.15
string trimright string ?chars? ................................................................................... 31
2 文件访问 .................................................................................................................................................. 31
2.1
2.2
2.3
2.4
2.5
文件名 ........................................................................................................................................ 31
基本文件输入输出命令 ............................................................................................................. 31
随机文件访问............................................................................................................................. 33
当前工作目录............................................................................................................................. 33
文件操作和获取文件信息 ......................................................................................................... 34
3 错误和异常 .............................................................................................................................................. 38
3.1
3.2
3.3
3.4
错误 ............................................................................................................................................ 38
从TCL脚本中产生错误 ............................................................................................................. 40
使用catch捕获错误 .................................................................................................................... 40
其他异常 .................................................................................................................................... 41
1 深入TCL .................................................................................................................................................... 43
1.1
1.2
查询数组中的元素 ..................................................................................................................... 43
info命令 ...................................................................................................................................... 45
1.2.1 变量信息............................................................................................................................. 45
1.1.1 过程信息............................................................................................................................. 46
1.1.2 命令信息............................................................................................................................. 47
1.1.3
TCL的版本和库 ................................................................................................................. 48
1.1.4 命令的执行时间 ................................................................................................................. 48
1.1.5 跟踪变量............................................................................................................................. 48
1.1.6 命令的重命名和删除 ......................................................................................................... 51
1.1.7
unknown命令 ...................................................................................................................... 52
1.1.8 自动加载............................................................................................................................. 53
9/5/2012
版权所有,好好利用
第4页,共70页
TCL培训教程(全) 华为内部资料
2 历史记录 .................................................................................................................................................. 54
3
TCL和C\C++.............................................................................................................................................. 56
3.1
3.2
生成自己的TCLSH .................................................................................................................... 57
扩展自己的命令:方法(一) ...................................................................................................... 57
3.2.1 编写扩展命令对应的C/C++过程 ...................................................................................... 57
3.2.2 注册命令............................................................................................................................. 59
3.2.3 命令返回值和命令对应的过程的返回值 ......................................................................... 60
3.3
扩展自己的命令:方法(二) ...................................................................................................... 62
3.3.1
Tcl_Obj结构 ....................................................................................................................... 62
3.3.2 编写扩展命令对应的C/C++过程 ...................................................................................... 64
3.3.3 注册命令............................................................................................................................. 65
3.4
3.5
利用clientData参数和deleteProc参数 ....................................................................................... 65
在C/C++应用程序中嵌入TCL .................................................................................................. 68
4 总结 ........................................................................................................................................................... 70
9/5/2012
版权所有,好好利用
第5页,共70页
TCL培训教程(全) 华为内部资料
TCL培训教程(全)
关键词:TCL
摘 要:本文是TCL教材的第三稿,前两稿分别是《TCL的使用》和《TCL培训教程》。这
一稿加入了不少内容,是北研TCL兴趣小组共同努力的结果。本文详细介绍了TCL
的各个方面,特别对利用C\C++语言扩展TCL命令作了详细论述。本文附有大量实
例。
缩略语清单: TCL Tool Command Language 一种脚本语言
参考资料清单: 请在表格中罗列本文档所引用的有关参考文献名称、作者、标题、编号、发布日期和
出版单位等基本信息。
名称
作者
参考资料清单
编号
查阅地点或
发布日期
渠道
Tcl and Tk
ToolKit
John
K.Ousterhout
981-235-
951-6
1999
自己的图
书
TCL的使用 陈旭盛
TCL培训教程 陈旭盛
自写文档
自写文档
1 引言
出版单位(若不
为本公司发布的
文献,请填写此
列)
Addison
Wesley
Publishing
Commpany
TCL(Tool Command Language)是一种解释执行的脚本语言(Scripting Language)。 它提供了通用的
编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。
由于TCL的解释器是用一个C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作
一个C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,可以很容易就在C\C++应用程序
中嵌入TCL,而且每个应用程序都可以根据自己的需要对TCL语言进行扩展。我们可以针对某一特定
应用领域对TCL语言的核心命令集进行扩展,加入适合于自己的应用领域的扩展命令,如果需要,甚
至可以加入新的控制结构,TCL解释器将把扩展命令和扩展控制结构与固有命令和固有控制结构同等
看待。扩展后的TCL语言将可以继承TCL 核心部分的所有功能,包括核心命令、控制结构、数据类
型、对过程的支持等。根据需要,我们甚至可以屏蔽掉TCL的某些固有命令和固有控制结构。通过对
9/5/2012
版权所有,好好利用
第6页,共70页
TCL培训教程(全) 华为内部资料
TCL的扩展、继承或屏蔽,用户用不着象平时定义一种计算机语言那样对词法、语法、语义、语用等
各方面加以定义,就可以方便的为自己的应用领域提供一种功能完备的脚本语言。
TCL良好的可扩展性使得它能很好地适应产品测试的需要,测试任务常常会由于设计和需求的改
变而迅速改变,往往让测试人员疲于应付。利用TCL的可扩展性,测试人员就可以迅速继承多种新技
术,并针对产品新特点迅速推出扩展TCL命令集,以用于产品的测试中,可以较容易跟上设计需求的
变化。
另外,因为TCL是一种比C\C++ 语言有着更高抽象层次的语言,使用TCL可以在一种更高的层次
上编写程序,它屏蔽掉了编写C\C++程序时必须涉及到的一些较为烦琐的细节,可以大大地提高开发
测试例的速度。而且, 使用TCL语言写的测试例脚本,即使作了修改,也用不着重新编译就可以调用
TCL解释器直接执行。可以省却不少时间。
TCL 目前已成为自动测试中事实上的标准。
2 语法
简单的讲,TCL语言的语法实际上是一些TCL解释器怎样对TCL命令进行分析的规则的集合。
2.1 脚本、命令和单词符号
一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都
是合法的:
set a 1
set b 2
或
set a 1;set b 2
TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参
数,单词之间必须用空格或TAB键隔开。
TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL 解释器运用规则
把命令分成一个个独立的单词,同时进行必要的置换(substitution); 在执行阶段,TCL 解释器会把第
一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,
并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。
2.2 置换(substitution)
注:在下面的所有章节的例子中,'%'为TCL的命令提示符,输入命令回车后,TCL会在接着的一
行输出命令执行结果。'//'后面是我自己加上的说明,不是例子的一部分。
9/5/2012
版权所有,好好利用
第7页,共70页
TCL培训教程(全) 华为内部资料
TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如:
%set x 10 //定义变量x,并把x的值赋为10
10
%set y x+100 //y的值是x+100,而不是我们期望的110
x+100
上例的第二个命令中,x被看作字符串x+100的一部分,如果我们想使用x的值'10' ,就必须告诉
TCL解释器:我们在这里期望的是变量x的值,而非字符'x'。怎么告诉TCL解释器呢,这就要用到TCL
语言中提供的置换功能。
TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单
词本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。
2.2.1 变量置换(variable subtitution)
变量置换由一个$符号标记,变量置换会导致变量的值插入一个单词中。例如:
%set y $x+100 //y的值是10+100,这里x被置换成它的值10
10+100
这时,y的值还不是我们想要的值110,而是10+100,因为TCL解释器把10+100看成是一个字符串
而不是表达式,y要想得到值110,还必须用命令置换,使得TCL会把10+100看成一个表达式并求值。
2.2.2 命令置换(command substitution)
命令置换是由[]括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被另
一个命令的结果所代替。例如:
%set y [expr $x+100]
110
y的值是110,这里当TCL解释器遇到字符'['时,它就会把随后的expr作为一个命令名,从而激活与
expr对应的C/C++过程,并把'expr'和变量置换后得到的'10+110'传递给该命令过程进行处理。
如果在上例中我们去掉[],那么TCL会报错。因为在正常情况下,TCL解释器只把命令行中的第一
个单词作为看作命令,其他的单词都作为普通字符串处理,看作是命令的参数。
注意,[]中必须是一个合法的TCL脚本,长度不限。[]中脚本的值为最后一个命令的返回值,例
如:
%set y [expr $x+100;set b 300] //y的值为300,因为set b 300的返回值为300
300
有了命令置换,实际上就表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参
数。
9/5/2012
版权所有,好好利用
第8页,共70页