1、基本命令格式换(如下总结一些易错的知识点)
“#”:注释
";"或者"换行"作为语句的结束
2、变量
变量不需要事先声明;
在使用变量时要在变量名前加$,如$var;
set var 3,set命令用来给变量赋值;
unset var,unset命令用来删除变量;
3,组合和替代
替代
变量替代:如前面的变量赋值
命令替代:这种形式的替代使用方括号"[]"来实现:
注意set a 3; set len [expr $a*2]; 输出结果是6,tcl中变量只有字符串一种,
所以通过$a的值应该是字符串'3',在expr中转换成数值3并进行计算。
反斜杠替代:和c语言类似,与特殊含义字符组合就表示这个字符本身,如“\$” "\{" “\}” "\[" "\]" "\\"来表示这些符号本身$ {} [] \.不再具有特殊含义。
表示续行;和C类似,换页换行等替代。
组合
通过双引号或者{}使两个字符串组合成一个字符串。
替代与组合的顺序
从左到右遍历参数,组合的决定是在替代前做出的
示例:set a 3; set b 5;
puts"$a+$b=[set a [expr $a+$b]]"
=>3+5=8 #首先进行组合,扫描到$a+$b=,得到3+5=,然后替换[]内的,得到值8,且此时a=8;
puts"[set a [expr $a+$b]]=$a+$b"
=>13=13+5 #[]是实现了命令替代,上面已经得到a=8,所以前面是a又被赋值13,后面a也是13了
4、数学运算
运算符与C基本类似
5、流程控制
if语句: 后面的表达式是使用{},if{$a==0}{命令体};
switch语句 : 则通过指定是-exact,-glob,-regexp来完成匹配;
while语句: 后面表达式和命令体也是使用{};
foreach语句:foreach Var {valuelist} {body},从数据列表中依次取出数值来赋给变量Var,然后执行一次命令体body,
valuelist是用花括号括起来的多个值的组合;
for循环语句: for{set I 1} {$I<11}{ incr 1 } {body}#单独的{}来处理3个部分,同c类似;
break与continue命令:与C类似;
catch命令:catch { 命令体} result,result用来保存命令结果或者出错信息,如果无错误,返回0给result,若有错则为非0;
6、过程:
自定义过程:proc name {params} {body} #就是定义函数,name为函数名,后面是参数,body是函数体,调用时直接 name var1 var2..;
rename命令:可以改变一个命令的名称
作用域:proc内为局部变量,之外的为全局变量,与C类似,但是在proc内使用全局变量时需要前面加上 global关键字。
递归调用过程:在proc内调用自己,但要有递归结束条件,与C类似
7、数组
定义数组:不用事先定义一个集合,而是直接每次用set定义出数组中的一个元素来。下标可以不是数字,可以是任意字符。unset 数组名 删除数组。
array命令:array 处理数组的命令体,例如array exists arr#判断是否存在数组,如果存在返回1,否则返回0.
示例: set ll [list 0 aa 1 b 2 cc]#构建列表
array set arr $ll #从列表来构建数组,结果为arr(0)=aa,arr(1)=bb,arr(2)=cc
set arr(0)
=>aa
array get arr
=>0 aa 1 bb 2 cc
foreach index [array names arr]
{puts stdout $arr($index)
}
=>aa
bb
cc
while{[array anymore arr $id]}#如果数组还有剩余元素
{
set index[array nextelement arr $id] #获得下一个元素的索引
puts"\$arr($index)=$arr($index)"#打印数组元素的值
}
=>$arr(0)=aa
$arr(1)=bb
$arr(2)=cc