系统学习TCL脚本入门教程.docx
- 文档编号:11618372
- 上传时间:2023-03-28
- 格式:DOCX
- 页数:87
- 大小:60.81KB
系统学习TCL脚本入门教程.docx
《系统学习TCL脚本入门教程.docx》由会员分享,可在线阅读,更多相关《系统学习TCL脚本入门教程.docx(87页珍藏版)》请在冰豆网上搜索。
系统学习TCL脚本入门教程
系统学习TCL脚本入门教程
版本:
1.0
作者:
次
1TCL语法
1.1简介
作为脚本语言,tcl语法简单而功能强大。
它诞生于80年代初,进入中国的时间也许多年了。
不过关于tcl的资料多而杂,一时心血来潮,想到写一篇文章,以例子为中心,系统讲解tcl语法,让技术人员花最少的时间对tcl有个全面而系统的了解,工作上使用时可以速查或参考代码。
于是有了本文。
1.2运行环境
多数代码运行在ActiveTcl8.3.4.1-9.win32-ix86.exe安装以后的windows环境中,只有两个例程运行在unix的环境下。
1.3本文约定
本文为了便于速查和速学,所以每课分成讲解和例子两部分,主要是围绕着例子进行讲解。
文字不多。
1.4参考资料
本文主要参考了《TclTutor2.0beta4》。
2引言
2.1第1课:
简单文本输出
讲解:
1.注释符号是#或者;#,在命令后注释用;#,在行开头两者均可;
2.puts:
输出文本,多个单词如被空格或TAB分隔需要使用“”或{}括起来;
3.多个命令写在一行使用;间隔。
例子:
002_puts.tcl
#ok;#正确
;#ok;#正确
;#ok;#正确,分号和井号之间可以有空格
putsHello;#正确
putsHello,World;#正确,多个单词之间不是被空格或者TAB分隔开
putsHelloWorld;#这行命令运行出错,被空格分隔
puts"Hello,World-Inquotes";#注释
puts{Hello,World-InBraces}#这行命令运行出错,必须使用;#作为注释符号
puts"Thisisline1";puts"thisisline2";#正确,用分号分隔两个命令
puts"Hello,World;-Withasemicoloninsidethequotes";#正确,分号在双引号内,作为字符串一部分
2.2第2课:
给变量赋值
讲解:
1.set:
给变量赋值,格式为setvarvalue
例子:
003_var.tcl
;#给变量X赋一个字符串
setX"Thisisastring"
;#给变量Y赋一个数字
setY1.24
;#显示X和Y的内容
puts$X
puts$Y
;#打印一个分隔串
puts"..............................."
;#打印在一行中,推荐使用双引号
setlabel"ThevalueinYis:
"
puts"$label$Y"
puts$label$Y
2.3第3课:
命令的赋值与置换一
讲解:
1.TCL中命令的赋值分为置换和赋值两个步骤
2.续行符为\
3.转义符同为\
4.特殊字符列表:
序号
字符
输出
十六进制
1
\a
响铃
\x07
2
\b
回车
\x08
3
\f
清屏
\x0c
4
\n
换行
\x0a
5
\r
回车
\x0d
6
\t
制表符
\x09
7
\v
垂直制表符(VerticalTab)
\x0b
8
\ddd
八进制值
d=0-7
9
\xhh
十六进制值
h=0-9,A-F,a-f
例子:
004_eval.tcl
;#Showhowa\affectsthe$
setZ"Albany"
setZ_LABEL"TheCapitolofNewYorkis:
"
puts"$Z_LABEL$Z";#显示Albany
puts"$Z_LABEL\$Z";#显示$Z,被\转义
;#Thenextlineneedsabackslashtoescapethe'$'
puts"\nBenFranklinisonthe\$100.00bill";#\n换行;$100前的\必须有,否则会将100作为一个变量,提示出错
seta100.00
puts"Washingtonisnotonthe$abill";#Thisisnotwhatyouwant
puts"Lincolnisnotonthe$$abill";#显示$100,说明是后结合的,先置换了$a,此处严格的写应该写为\$$a
puts"Hamiltonisnotonthe\$abill";#显示$a
puts"BenFranklinisonthe\$$abill";#显示$100,说明是后结合的,先置换了$a
puts"\n.................examplesofescapestrings"
puts"Tab\tTab\tTab"
puts"Thisstringprintsout\nontwolines";#行中\没有打印出来,如果要打印出来,需要写成\\
puts"Thisstringcomesout\
onasingleline";#当一行太长,不便于阅读,使用\做续行符
2.4第4课:
命令的赋值与置换二
讲解:
1.最外层是{}则不会进行置换操作,但其中的续行符仍然有效
例子:
005_escape.tcl
setZ"Albany"
setZ_LABEL"TheCapitolofNewYorkis:
"
puts"\n.................examplesofdifferencesbetween\"and\{";#and前的双引号前必须有\进行转义,否则这个双引号回和前面的双引号结合,导致成了“xxx”and\{“的结构,会提示出错
puts"$Z_LABEL$Z";#显示TheCapitolofNewYorkis:
Albany
puts{$Z_LABEL$Z};#显示$Z_LABEL$Z,没有进行置换,{}中不会置换
puts"\n.......examplesofdifferencesinnesting\{and\""
puts"$Z_LABEL{$Z}";#最外层是双引号,所以进行了置换
puts{Whosaid,"Whatthiscountryneedsisagood$Zcigar!
"?
};#最外层是花括号,所以没有进行置换
puts"\n.................examplesofescapestrings"
puts{Therearenosubstitutionsdonewithinbraces\n\r\x0a\f\v};#
puts{But,theescapednewlineattheendofa\
stringisstillevaluatedasaspace};#续行符仍然生效
2.5第5课:
命令的赋值与置换三
讲解:
1.[]可以传递其中的命令结果,注意不能被{}包含;
2.双引号包含的[]中的命令可以正常执行,命令结果也可以传出;
3.{}包含的[]中的命令不会执行,更不会有命令结果传出来。
例子:
006_escape.tcl
setx"abc"
puts"Asimplesubstitution:
$x\n";#显示abc
sety[setx"def"];#先执行[]中的命令,将”def”赋值给x,然后将该命令的结果赋值给y
puts"Rememberthatsetreturnsthenewvalueofthevariable:
X:
$xY:
$y\n";#显示x和y都是def
setz{[setx"Thisisastringwithinquoteswithinbraces"]};#由于在{}中,所以并没有执行对x的赋值,只是将{}赋值给z
puts"Notethecurlybraces:
$z\n"
seta"[setx{Thisisastringwithinbraceswithinquotes}]";#执行了对x的赋值操作,并将值传出来赋给了a
puts"Seehowthesetisexecuted:
$a"
puts"\$xis:
$x\n"
setb"\[sety{Thisisastringwithinbraceswithinquotes}]"
puts"Notethe\\escapesthebracket:
\n\$bis:
$b"
puts"\$yis:
$y"
2.6第6课:
算数运算
讲解:
1.操作符
序号
操作符
解释
1
-+~!
-:
负号+:
正号~:
位操作非!
:
逻辑非
2
*/%
*:
乘/:
除%:
取模
3
+-
+:
加-:
减
4
<<>>
<<:
循环左移>>:
循环右移
5
&
&:
按位与
6
^
^:
按位异或
7
|
|:
按位或
8
&&
&&:
逻辑与
9
||
||:
逻辑或
10
x?
y:
z
if-then-else
2.数学函数
序号
函数
序号
函数
1
acos
11
log10
2
cos
12
tan
3
hypot
13
atan2
4
sinh
14
floor
5
asin
15
pow
6
cosh
16
tanh
7
log
17
ceil
8
sqrt
18
fmod
9
atan
19
sin
10
exp
例子:
007_math.tcl
setX100;
setY256;#行末是否有分号都可以
setZ[expr"$Y+$X"];#变量是否被双引号包含都可以,不过建议使用双引号
setZ[expr$Y+$X]
setZ_LABEL"$Yplus$Xis"
puts"$Z_LABEL$Z"
puts"Thesquarerootof$Yis[exprsqrt($Y)]\n"
puts"Becauseoftheprecedencerules\"5+-3*4\"is:
[expr-3*4+5]"
puts"Becauseoftheparentheses\"(5+-3)*4\"is:
[expr(5+-3)*4]"
puts"\n.................moreexamplesofdifferencesbetween\"and\{"
puts{$Z_LABEL[expr$Y+$X]};#外层是花括号不会进行置换
puts"$Z_LABEL{[expr$Y+$X]}";#外层是双引号会进行置换
puts"Thecommandtoaddtwonumbersis:
\[expr\$a+\$b]"
2.7第7课:
文本比较-SWITCH应用
讲解:
1.switch的分支中的命令使用花括号包含,但是并不会影响花括号中的命令执行,切记,这是switch的格式;
2.如果不想分支条件进行置换,需要在外加上花括号,不会影响分支中的命令执行。
例子:
008_switch.tcl
;#Setthevariableswe'llbecomparing
setx"ONE";
sety1;
setz"ONE";
;#Thisislegal
switch$x"ONE""putsONE=1""TWO""putsTWO=2""default""putsNO_MATCH";#这种写法合法,但是阅读不便
switch$x\
"ONE""putsONE=1"\
"TWO""putsTWO=2"\
"default""putsNO_MATCH";#这种写法好看一些,推荐
;#下面这种写法$z被置换,走入$z的条件分支,表面上看条件分支中的命令在花括号内,这只是switch的一种格式,所以其中的命令仍然被执行了。
switch$x\
"$z"{sety1[expr$y+1];puts"MATCH\$z.$y+$zis$y1"}\
"ONE"{sety1[expr$y+1];puts"MATCHONE.$y+oneis$y1"}\
"TWO"{sety1[expr$y+2];puts"MATCHTWO.$y+twois$y1"}\
"THREE"{sety1[expr$y+3];puts"MATCHTHREE.$y+threeis$y1"}\
"default"{puts"$xdoesnotmatchanyofthesechoices"}
;#Thisformofthecommanddisablesvariablesubstitutioninthepattern
;#下面为了不置换$z,在外层加上了花括号,于是走入了ONE分支,而分支中的命令仍然被执行了
switch$x{
"$z"{sety1[expr$y+1];puts"MATCH\$z.$y+$zis$y1"}
"ONE"{sety1[expr$y+1];puts"MATCHONE.$y+oneis$y1"}
"TWO"{sety1[expr$y+2];puts"MATCHTWO.$y+twois$y1"}
"THREE"{sety1[expr$y+3];puts"MATCHTHREE.$y+threeis$y1"}
"default"{puts"$xisNOTAMATCH"}
}
2.8第8课:
数值比较-IF应用
讲解:
1.条件式结果
FALSE
TRUE
数值
0
非零
yes/no
no
yes
true/false
false
true
2.置换变量的方法,setyx;puts$$y,因为是后结合并且是一次置换,所以打出来的是$x,不是$x的值;但是在if的条件式中进行了二次置换,$$y被置换成了$x的值
3.注意:
新行中需要写为}else{,不能将}写到前一行的末尾,也不能省略}后面的那个空格,后面的{也需要写在当行,并且前面需要一个空格。
例子:
009_if.tcl
setx1;
if{$x==2}{puts"$xis2"}else{puts"$xisnot2"};#判断是否相等使用==
if{$x!
=1}{;#判断是否不等使用!
=
puts"$xis!
=1"
}else{
puts"$xis1"
}
if$x==1{puts"GOT1"}
setyx;
if"$$y!
=1"{;#在if条件式中$$y进行了二次置换
puts"$$yis!
=1";#在puts命令中,只进行了一次置换
}else{
puts"$$yis1"
}
2.9第9课:
WHILE循环
x讲解:
1.while后面的条件表达式是放在花括号中的;放在双引号中会只执行一次置换
例子:
010_while.tcl
setx1;
while{$x<5}{puts"xis$x";setx[expr$x+1]}
puts"exitedfirstloopwithXequalto$x\n"
setx0;
while"$x<5"{;#只执行一次置换1<5,于是该条件永远为真
setx[expr$x+1]
if{$x>6}break;;#如果去掉这句就成了死循环
if"$x>3"continue;;#这句使4打不出来
puts"xis$x";
}
puts"exitedsecondloopwithXequalto$x\n"
2.10第10课:
FOR循环和incr
讲解:
1.incrx和setx[expr$x+1]达到一样的效果,向上加一
x
例子:
011_for.tcl
for{puts"Start";seti0}{$i<2}{incri;puts"Iafterincr:
$i";}{;#第一部分只执行一次,后面两部分每次循环都会执行
puts"Iinsidefirstloop:
$i"
}
for{puts"Start";seti3}{$i<2}{incri;puts"Iafterincr:
$i";}{;#不会执行循环体中的命令
puts"Iinsidesecondloop:
$i"
}
puts"Start";seti0;
while{$i<2}{
puts"Iinsidefirstloop:
$i"
incri;
puts"Iafterincr:
$i";
}
2.11第11课:
过程PROC
讲解:
1.格式:
procnameargsbody
2.调用方法中参数可以用花括号或者双引号包含,也可以不包含
3.在puts等命令中需要置换的话,需要使用方括号
例子:
012_proc.tcl
procsum{arg1arg2}{
setx[expr$arg1+$arg2];
return$x;#过程返回值
}
puts"Thesumof2+3is:
[sum23]\n\n";#调用过程
#puts"Thesumof2+3is:
[sum{23}]\n\n";#出错,提示找不到第二个参数,置换过程中第一个参数是{23},所以找不到第二个参数
puts"Thesumof2+3is:
sum(23)\n\n";#输出sum(23),因为没有方括号,根本没有进行置换
puts"Thesumof2+3is:
sum{23}\n\n";#输出sum{23},因为没有方括号,根本没有进行置换
sum23;#正确
sum{2}{3};#正确
sum"2""3";#正确
procfor{abc}{
puts"Theforcommandhasbeenreplacedbyaputs";
puts"Theargumentswere:
$a\n$b\n$c\n"
}
for{seti1}{$i<10}{incri}
2.12第12课:
过程PROC的参数定义
讲解:
1.过程的参数赋缺省值:
procname{arg1{arg2value}}
2.过程的不确定个数的参数定义:
procname{arg1args}
例子:
013_proc.tcl
procexample{first{second""}args}{;#参数定义:
赋缺省值和不确定个数参数定义
if{$second==""}{
puts"Thereisonlyoneargumentanditis:
$first";
return1;
}else{
if{$args==""}{
puts"Therearetwoarguments-$firstand$second";
return2;
}else{
puts"Therearemanyarguments-$firstand$secondand$args";
return"many";
}
}
}
setcount1[exampleONE]
setcount2[exampleONETWO]
setcount3[exampleONETWOTHREE]
setcount4[exampleONETWOTHREEFOUR]
puts"Theexamplewascalledwith$count1,$count2,$count3,and$count4Arguments"
2.13第13课:
变量的作用域
x讲解:
1.全局变量定义:
globalvar1
2.局部变量:
upvarxy等同于upvar1xy,作用有两个:
一是将上一层的x的值赋给y;二是将上一层的x的地址赋给y,于是修改y等于修改x。
1代表作用范围,也可为2,3等,不能为0
例子:
014_varscope.tcl
procSetPositive{variablevalue}{;#此处variable只是一个参数名,可以修改为其他的来代替变量
upvar$variablemyvar;#此处也可写为upvar1$variablemyvar
if{$value<0}{setmyvar[expr-$value];}else{setmyvar$value;}
return$myvar;
}
SetPositivex5;
SetPositivey-5;
puts"X:
$xY:
$y\n"
proctwo{y}{
upvar1$yz;#此处绑定了two中的z和one中的y
upvar2xa;#此处绑定了主程序中的x和two中的a
puts"two:
Z:
$zA:
$a"
setz1;;#Setz,thepassedvariableto1;
seta2;;#Setx,twolayersupto2;
}
;#Afirstlevelproc-Thiswillbecalledbytheglobalspacecode.
procone{y}{
upvar$yz;#Thistie
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 系统 学习 TCL 脚本 入门教程