TCL常用命令速查

#注释

#这个10在tcl脚本看来只是个字符,而不代表真实的数值含义
#相比之下Perl可以对其自动匹配,即判断是数字还是字符
#C语言是用户定义是int还是char

set x 10
set y 20; #同行加注释,需要用;隔开

#如果在其他命令中需要引用已经声明的变量,则可以使用$

set a 10
set x $a

#如果想将a变成真正的数值参与运算,应使用expr

expr 10 + 100 ;#得到结果是110

#就是这样算出来的,110仍然不是数值
#中括号通常用于包裹一个函数操作,并且将处理结果反馈作为变量的值
#换而言之,由于有了[]的参与,一行tcl中可以带有两个或者多个命令
#通过层层执行,层层赋值的方式,得到一个较为复杂的结果

set y [expr 10 + 100]

#如果要将变量打印出来,则使用puts命令
#格式为puts+文件句柄+变量
#若不写文件句柄,则默认打印在显示器上,即终端界面

puts $x

#使用set+变量名,后面不跟数值,也可以打印出相同的内容

set x

#若要注销已经声明的变量,则应该使用unset命令
#注销了3个变量,中间使用空格隔开

unset x y z

#若要在变量后面追加更多的字符,则应该使用append命令
#如下例所示,变量x开始时是10,然后在其后面追加abc
#最终x的值是10abc
#由于10本身是字符而非数值,所以10abc只是简单的字符串结合操作,不含运算

set x 10

#x不用加$,因为本命令将改变x本身的值

append x abc

#有些字符具有特殊含义,如果要将这些字符赋值给变量,则需要转义字符
#转义字符用反斜杠\表示
#例如[]在tcl中表示一个函数操作
#变量x被赋值为[2],其中前半个中括号使用了转义符
#后半个不需要转义也能自动转义

set x \[2]

#如果要定义一个集合,则可以使用{}
#x被定义为1-3组成的集合
#这里的字符集合和C语言的数组存在差异
#数组是数值组成,tcl中都是字符,只是没有结合到一起的字符,也可称为list

set x {1 2 3}

#用list命令也可以建立列表

set x [list 1 2 3]

#从列表中取出其中的一项也需要执行一个命令
#从变量中取出第二项,注意tcl列表初始编号为0

lindex $x 2

#使用llength可以获得列表长度

llength $x

#在列表中插入一个新项,可以使用linsert
#例如,将变量y的内容插入变量x的第3项,原来的第3项及此后的项将向后移动。
#该命令不影响x的值,产生的新列表可以用于给其他变量赋值

linsert $x 3 $y

#这里不论变量y的内容是普通字符串还是列表,都支持插入
#但是,如果y是列表,则插入后会形成一个拥有两项的复合列表
#而不是简单地扩展了项数,例如x是aaa,y是列表{1 2 3}

#{aaa {1 2 3}}

#若将y的内容插入到x的最后,则可以用end来代替3

linsert $x end $y

#如果要在结尾添加新的项,也可以使用lappend
#x不用加$,因为本命令将改变x本身的值

lappend x 1 3 4

#lreplace命令可以替换列表中的项
#将第1项到第3项,替换成5 6 7
#该命令不影响x的值,产生的新列表可以用于给其他变量赋值

lreplace $x 1 3 5 7

#lrange命令可以截取列表中的一段
#从第1项到第3项,初始项是第0项

lrange $x 1 3

#在列表中使用lsearch命令来查找一个字符
#如下例在x中查找33,若找到返回列表序号,若未找到返回-1
#该命令可以加入一些控制选项

# -exact 精确匹配
# -glob 支持通配符查找
# -regexp 支持正则表达式查找
# .* 表示任意字符串,可以不存在 
# .+ 表示任意字符串,必须存在 
lsearch -regexp $x .*3 .+ 

#lsort可以对列表进行排序
#默认按照ASCII的顺序排序,若加入选项,可以支持其他排序方式

# -integer 按照整数排序
# -real 按照浮点数排序
# -increasing 按照ASCII排序,升序
# -decreasing 按照ASCII排序,降序

#注意,该命令只是用于读取x并排序,不会将排列结果再赋值给x

lsort -decreasing $x

#split可以将字符串中的每个字符单独作为列表的项
#即把字符串转换成列表
#如下所示,将字符串abc拆成a,b,c这三项

split "abc" {}

#{}里面是空的,说明拆分是按字符拆分的
#若使用下面的表达式,则字符串也可以被拆分成三个列表abc,ef,g3
#拆分的分隔符是冒号

split "abc:ef:g3" :

#也可以将列表转换成字符串,使用join命令

join {1 2 3} @

#@表示使用的连接符,最终效果是1@2@3

#tcl if-else表达式
#需要注意,条件和结果都需要用{}

if{条件1}{
	结果1
}elseif{条件2}
	结果2
}else{
	结果3
}

#tcl switch表达式

switch[条件选项] $x{
	a {结果1}
	b {结果2}
	c {结果3}
	default {结果4}
}

#tcl 循环表达式 while

while{条件}{
	循环体
}

#tcl 循环表达式 for

for{条件}{
	循环体
}

#tcl 循环表达式 foreach
#先对变量i赋值,并将i用于其后的循环中,i会从列表a中逐一取值

foreach i $a{
	循环体
}

#foreach也可以实现多个变量同时赋值和循环

foreach i {1 2 3} j {1 2 3}{
	循环体
}

#在循环中也支持break continue这种跳出循环的表达式

#tcl还可以自定义函数proc
#语法是
#proc+函数名+参数列表+{函数功能块}

proc add {x y} {expr $x + $y}

#在较为复杂的proc表达式中,还可以使用return命令来将某个变量指定为返回值

#调用函数的方法:函数名+参数

set z [add 1 3]

#tcl的函数有局部变量和全局变量之分
#若在函数中使用外部的变量,则不能直接使用
#需要用global声明,

set a 10
proc add {x y} {
	global a
	expr $x + $y + $a
}

#还可以给参数赋一个默认的值,以方便调用

proc add {{x 1}{y 2}} {expr $x + $y}

#tcl对数值的处理比较繁琐,而对字符串是他的强项
#tcl主要用于命令行中对文件名,目录名,路径等字符串进行操作
#格式化字符串或输出到屏幕上,或输出到另一个字符串变量中

format "%s is %d" $x $Y

#用正则表达式进行字符串匹配
#regexp+选项+匹配图样+字符串,匹配返回1,不匹配返回0

regexp {abc} baiabc001 ;#成功返回1

#正则表达式使用方法详情--------见文章 正则表达式

#对字符串进行匹配可以使用长命令string compare
#比较的是字符串的第一个不同字符在ASCII码中出现的位置
#不是字符串的长度
#ASCII前 ASCII后 返回-1
#ASCII后 ASCII前 返回1
#两个字符相同,返回0

# -nocase 不区分大小写
# -length 10 只比较前10
string compare -length 10 abc bac

#单纯比较两个字符串是否相同,相同返回1

string equal

#获取字符串长度,下例返回3

string length abc

#将小写字母转换成大写字母,下例返回abc

string tolower ABC

#将大写字母转换成小写字母,下例返回ABC

string toupper abc

#tcl也可用于打开、关闭、读写和删除文件
#打开文件使用open命令,$filename是文件
#r表示打打开的目的,读是r,写是w,既读又写则是r+
#若是写,但是会在后面再追加一段写,则改为a
#打开文件后,总会产生一个句柄,后续用句柄表示文件本身
#该句柄被赋值给变量x

set x [open $filename r]

#关闭文件

close $x

#使用get命令可以获取文件的内容
#如下,把x句柄所代表的文件中的每行内容都赋值给y

while{gets $x y}

#在文件中写操作,仍然用puts命令

puts $x "abc"

#若文件句柄为stdout,则表示写到显示器上
#若句柄为stdin,则表示键盘鼠标等输入设备,可以直接读入
#当文本更新缓慢,没有显示出新的内容,需要刷新时

flush $x

#对文件进行读写,需要判断从哪里开始读写,这个就是文件的指针
#刚打开文件时。指针会指向文件的开头
#但是也会有从中间开始读写的需求,所以需要有指针跳跃的命令seek

seek $x 10 current

#指针从当前位置向后移动10个字符,即为新指针的位置,10表示偏移量
#current可以用start和end替换
#start表示文件开头,end表示文件结尾
#用end时,偏移数值应该是负值

tell $x ;#报告指针的位置
eof $x ;#当eof返回1时,表示指针在文件的结尾处

#tcl进行路径和目录的管理
#在一个路径中查找文件名,用glob命令
#查找文件名时,无法使用正则表达式。但是可以使用通配符*,以及[]括起来的字符集合
#如下例中,查找文件名为{abc, a123}/*hd.[co],这是一个模糊的匹配
#{abc, a123}表示abc和a123都能接受,[co]表示c和o都可以接受
#若文件路径出现abc/1hd.c或者a123/Ahd.o就会被找出
#若未找出,则在默认情况下就会报错,使用选项-nocomplain会抑制报错,返回0

glob -nocomplain {abc,a123}/*hd.[co]

#file atime命令可以报告文件的访问时间

file atime $y

#这里$y表示文件名字符串,不是句柄

#与文件目录相关的命令还包括

file mtime; #命令用于显示文件修改时间
file size; #命令用于显示文件的字节大小
file type; #命令用于显示文件的类型

#文件类型包括:纯文件、目录、字符设备、块设备、fifo、链接、socket
#复制文件或目录使用file copy,-force表示强制,复制目录时经常使用

file copy -force a.txt b.txt
file delete -force abc; #命令用于删除文件
file mkdir A1 A2 A3
file rename -force aaa bbb; #给文件或路径改名

#若要获取文件的全路径,则可以使用file dirname命令

file dirname; #获取文件全路径
file executable; #获知文件是否可执行
file exists; #获知文件目录是否存在
file extension; #获知文件扩展名
file isdirectory; #判断文件名称是否为一个目录
file lstat; #判断名称是否是一个软链接

#tcl中也可以运行一些其他语言编写的脚本,其调用的命令是exec
#下例为TCL执行Perl脚本,先执行abc.pl,然后将返回值赋值到变量x中

set x [exec perl abc.pl]

#若abc.pl中内容如下,则tcl中变量x的值为7

$a = 4; $b = 3; $c = $a + $b; print $c;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fresh&Fit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值