TCL脚本基础-Tcl 内建命令&名字空间

Tcl简介(二):Tcl 内建命令

Tcl 内建命令

Built-in commands 内建的命令

Tcl提供了下面描述的内建函数。
... 表示参数不定

append varName value
append varName value value value ...
将那一大堆value附加到varName后面。如果变量不存在,会新建一个。
例子:
set i "aaa"
append i "bbb" "ccc"
//i = aaabbbccc


array subcommand arrayName
array subcommand arrayName arg ...
这是一组用于向量操作的命令。第二个参数是子命令名。

假设:
set a(1) 1111
set a(2) 2222
set a(three) 3333
一下均以它为例子(tclsh在中运行)。

array names arrayName
返回一个数组元素名字的列表。
tclsh>array names a
1 2 three

array size arrayName
返回数组的元素个数。
tclsh>array size a
3

下面是用于遍历的命令
arrry startsearch arrayName
初始化一次遍历,返回一个遍历标示(searchId)在下面的命令是中使用。

array nextelement arrayName searchId
返回下一个数组中的元素。如果没有返回一个空串。

array anymore arrayName searchId
返回 1 表示还有更多的元素。0 表示没有了。

array donesearch arrayName searchId
结束该次遍历。

array nextelement arrayName searchId
返回下一个元素。

tclsh>array startsearch a
s-1-a
tclsh>array nextelement a s-1-a
1111
tclsh>array nextelement a s-1-a
2222
tclsh>array anymore a s-1-a
1
tclsh?array nextelement a s-1-a
3333
tclsh>array donesearch a s-1-a

注意可以同时并发多个遍历。

break
跳出最近的循环。

case string in patList body ...
case string patList body ...
case string in {patList body ...}
case string {patList body ...}
分支跳转。
例如:
case abc in {a b} {puts 1} default {puts 2} a* {puts 3}
return 3.

case a in {
{a b} {format 1}
default {format 2}
a* {format 3}
}
returns 1.

case xyz {
{a b}
{format 1}
default
{format 2}
a*
{format 3}
}
returns 2.
注意default不可以放在第一位。支持shell文件名风格的匹配
符。

catch command
catch command varName
用于阻止由于错误而导致中断执行。执行command, 每次都返回TCL_OK, 无论是否有错误发生。如有错误发生返回1 ,反之返回0。如果给了varName这被置为错误信息。注意varName是已经存在的变量。

cd
cd dirName
转换当前工作目录。如dirName未给出则转入home目录。

close fileId
关闭文件描述符。

concat arg ...
将参数连接产生一个表。
concat a b {c d e} {f {g h}}
return `a b c d e f {g h}'

continue
结束该次循环并继续循环。

eof fileId
如fileId以结束 返回1,反之返回 0。

error message
error message info
error message info code
返回一个错误,引起解释器停止运行。info用于初始化全局变
量errorInfo。code被付给errorCode。

eval arg ...
将所有的参数连起来作为命令语句来执行。

exec arg ...
仿佛是在shell下执行一条命令。
exec ls --color
exec cat /etc/passwd > /tmp/a

exit
exit returnCode
中断执行。

expr arg
处理表达式。
set a [expr 1+1]
//a=2

file subcommand name
一组用于文件处理的命令。
file subcommand name arg ...

file atime name
返回文件的最近存取时间。

file dirname name
返回name所描述的文件名的目录部分。

file executable name
返回文件是否可被执行。

file exists name
返回1 表示文件存在,0 表示文件不存在。

file extension name
返回文件的扩展名。

file isdirectory name
判断是否为目录。

file isfile name
判断是否为文件。

file lstat name varName
以数组形式返回。执行lstat系统函数。存储在varName。

file mtime name
文件的最近修改时间。

file owned name
判断文件是否属于你。

file readable name
判断文件是否可读。

file readlink name
都出符号连接的真正的文件名。

file rootname name
返回不包括最后一个点的字符串。

file size name
返回文件的大小。

file stat name varName
调用stat内和调用,以数组形式存在varName中。

file tail name
返回最后一个斜线以后的部分。

file type name
返回文件类型file, directory, characterSpecial,
blockSpecial, fifo, link, 或
socket。

file writable name
判断文件是否可写。

flush fileId
立即处理由fileId描述的文件缓冲区。

for start test next body
for循环。同C中的一样。

for {set i 1} {$i < 10} {incr i} {puts $i}

foreach varname list body
类似于C Shell中的foreach或bash中的for..in...

format formatString
format formatString arg ...
格式化输出,类似于C中的sprintf。
set a [format "%s %d" hello 100]
//a="hello 100"

gets fileId
gets fileId varName
从文件中读出一行。
set f [open /etc/passwd r]
gets $f

glob filename ...
glob -nocomplain filename ...
使用C Shell风格的文件名通配规则,对filename进行扩展。
ls /tmp
a b c

tclsh>glob /tmp/*
a b c
当加上参数 -nocomplain 时,如文件列表为空则发生一个错
误。

global varname ...
定义全局变量。

if test trueBody
if test trueBody falseBody
if test then trueBody
if test then trueBody else falseBody
条件判断,实在没什么说的。

incr varName
incr varName increment
如果没有incremnet,将varName加一,反之将varName加上increment。

set i 10
incr i
//i=11
incr i 10
//i=21

info subcommand
info subcommand arg ...
取得当前的Tcl解释器的状态信息。

info args procname
返回由procname指定的命令(你自己创建的)的参数列表。
如:
proc ff { a b c } {puts haha}
info args ff
//return "a b c" 

info body procname
返回由procname指定的命令(你自己创建的)的函数体。
如:
proc ff { a b c } {puts haha}
info body ff
//return "puts haha" 

info cmdcount
返回当前的解释器已经执行的命令的个数。

info commands
info commands pattern
如果不给出模式,返回所有的命令的列表,内建和自建的。
模式是用C Shell匹配风格写成的。

info complete command
检查名是否完全,有无错误。

info default procname arg varname
procname的参数arg,是否有缺省值。

info exists varName
判断是否存在该变量。

info globals
info globals pattern
返回全局变量的列表,模式同样是用C Shell风格写成的。

info hostname
返回主机名。

info level
info level number
如果不给参数number则返回当前的在栈中的绝对位置,参
见uplevel中的描述。如加了参数number,则返回一个列表包
含了在该level上的命令名和参数。

info library
返回标准的Tcl脚本的可的路径。实际上是存在变量
tcl_library中。

info locals
info locals pattern
返回locale列表。

info procs
info procs pattern
返回所有的过程的列表。

info script
返回最里面的脚本(用 source 来执行)的文件名。

info tclversion
返回Tcl的版本号。

info vars
info vars pattern
返回当前可见的变量名的列表。

下面是一些用于列表的命令,范围可以是end。

join list
join list joinString
将列表的内容连成一个字符串。

lappend varName value ...
将value加入列表varName中。

lindex list index
将list视为一个列表,返回其中第index个。列表中的第一个
元素下标是0。
lindex "000 111 222" 1
111

linsert list index element ...
在列表中的index前插入element。

list arg ...
将所有的参数发在一起产生一个列表。
list friday [exec ls] [exec cat /etc/passwd]

llength list
返回列表中元素的个数。
set l [list sdfj sdfjhsdf sdkfj]
llength $l
//return 3

lrange list first last
返回列表中从frist到last之间的所有元素。
set l [list 000 111 222 333 444 555]
lrange $l 3 end
//return 333 444 555

lreplace list first last
lreplace list first last element ...
替换列表中的从first到last的元素,用element。
set l [list 000 111 222 333 444 555]
lreplace $l 1 2 dklfj sdfsdf dsfjh jdsf
000 dklfj sdfsdf dsfjh jdsf 333 444 555

lsearch -mode list pattern
在列表中搜索pattern,成功返回序号,找不到返回-1。
-mode : -exact 精确
-glob shell的通配符
-regexp 正则表达式

lsearch "111 222 333 444" 111
//return 0
lsearch "111 222 333 444" uwe
//return 1

lsort -mode list
排列列表。
-mode : -ascii
-dictionary 与acsii类似,只是不区分大小写
-integer 转化为整数再比较
-real 转化为浮点数再比较
-command command 执行command来做比较

open fileName
open fileName access
打开文件,返回一个文件描述符。
access
r w a r+ w+ a+
定义与C中相同。如文件名的第一个字符为|表示一管道的形式
来打开。
set f [open |more w]
set f [open /etc/pass r]

proc name args body
创建一个新的过程,可以替代任何存在的过程或命令。

proc wf {file str} {
puts -nonewline $file str
flush $file
}

set f [open /tmp/a w]
wf $f "first line\n"
wf $f "second line\n"
在函数末尾可用 return 来返回值。

puts -nonewline fileId string
向fileId中写入string,如果不加上 -nonewline 则自动产
生一个换行符。

pwd
返回当前目录。

read fileId
read fileId numBytes
从fileId中读取numBytes个字节。

regexp ?switches? exp string ?matchVar? ?subMatchVar
subMatchVar ...?
执行正则表达式的匹配。
?switches? -nocase 不区分大小写
-indices 返回匹配区间
如:
regexp ^abc abcjsdfh
//return 1
regexp ^abc abcjsdfh a
//return 1
puts $a
//return abc

regexp -indices ^abc abcsdfjkhsdf a
//return 1
puts $a
//return "0 2"


regsub ?switchs? exp string subSpec varName
执行正则表达式的替换,用subSpec的内容替换string中匹配exp
的部分。
?switchs? -all 将所有匹配的部分替换,缺省子替换第一
个,返回值为替换的个数。
-nocase 不区分大小写。
如:
regsub abc abcabcbac eee b
//return 1
puts $b
//return "eeeabcabc"

regsub -all abc abcabcabc eee b
//return 3
puts $b
//return "eeeeeeeee"


return
立即从当前命令中返回。
proc ff {} {
return friday
}

set a [ff]
//a = "friday"

scan string `format' varname ...
从string中安format来读取值到varname。

seek fileId offset ?origin?
移动文件指针。
origin: start current end
offset从哪里开始算起。

set varname ?value?
设置varname用value,或返回varname的值。如果不是在一
个proc命令中则生成一个全局变量。

source fileName
从filename中读出内容传给Tcl解释起来执行。

split string ?splitChars?
将string分裂成列表。缺省以空白为分隔符,也可通
过splitChars来设定分隔符

string subcommand arg ...
用于字符串的命令。

string compare string1 string2
执行字符串的比较,按 C strcmp 的方式。返回 -1, 0, or 1。

string first string1 string2
在string1种查找string2的定义次出现的位置。未找到返回-1。

string length string
返回字符串string的长度。

string match pattern string
判断string是否能匹配pattern。pattern是以shell文件名的
统配格式来给出。

string range string first last
返回字符串string中从first到last之间的内容。

string tolower string
将string转换为小写。

string toupper string
将string转换为大写。

string trim string
将string的左右空白去掉。

string trimleft string
将string的左空白去掉。

string trimright string
将string的右空白去掉。

tell fileId
返回fileId的文件指针位置。

time command
执行命令,并计算所消耗的时间。
time "ls --color"
some file name
503 microseconds per iteration

trace subcommand
trace subcommand arg ...
监视变量的存储。子命令定义了不少,但目前只实现了
virable。
trace variable name ops command
name 为变量的名字。
ops 为要监视的操作。
r 读
w 写
u unset
command 条件满足时执行的命令。
以三个参数来执行 name1 name2 ops
name1时变量的名字。当name1为矢量时,name2为下标,ops
为执行的操作。

例如:
proc ff {name1 name2 op} {
puts [format "%s %s %s" name1 name2 op]
}
set a hhh
trace variable a r {ff}
puts $a
//return "a r\nhhh"

unknown cmdName
unknown 并不是 Tcl 的一部分,当 Tcl 发现一条不认识的命
令时会看看是否存在 unknown命令,如果有,则调用它,没有则出
错。

如:
#!/usr/bin/tclsh
proc unknown {cwd args} {
puts $cwd
puts $args
}
//下面是一条错误命令
sdfdf sdf sdkhf sdjkfhkasdf jksdhfk
//return "sdfdf sdf sdkhf sdjkfhkasdf jksdhfk"

unset name ...
删除一个或多个变量(标量或矢量)。

uplevel command ...
将起参数连接起来(象是在concat中)。最后在由level所指
定的上下文中来执行。如果level是一个整数,给出了在栈中的距
离(是跳到其它的命令环境中来执行)。
缺省为1(即上一层)。
如:
#!/usr/bin/tcl
proc ff {} {
set a "ff" //设置了局部的a
-------------------------
}
set a "global"
ff
puts $a
//return "global"

再看下一个:
#!/usr/bin/tcl
proc ff {} {
uplevel set a "ff" //改变上一级栈中的a
-------------------------------------
}
set a global
ff
puts $a
//return "ff"
如果level是以#开头后接一个整数,则level指出了在栈中的
绝对位置。如#0表示了顶层(top-level)。
a b c 分别为三个命令,下面是它们之间的调用关系,
top-level -> a -> b -> c -> uplevel level
绝对位置: 0 1 2 3
当level为 1 或 #2 都是在 b 的环境中来执行。
3 或 #0 都是在 top-level 的环境中来执行。

upvar ?level? otherVar myVar ?otherVar myVar ...?
在不同的栈中为变量建立连接。这里的level与uplevel中
的level是同样风格的。
例如:
#!/usr/bin/tcl
proc ff {name } {
upvar $name x
set x "ff"
}
set a "global"
ff a
puts $a
//return "ff"

while test body
举个例子吧:
set x 0
while {$x<10} {
puts "x is $x"
incr x
}

Built-in variables 内建的变量
下名的全局变量是由 Tcl library 自动来管理的。一般是只
读的。

env
环境变量数组。
如:
puts $env(PATH)
// return /bin:/usr/bin:/usr/X11R6/bin

errorCode
当错误发生时保存了一些错误信息。用下列格式来存储:
CHILDKILLED pid sigName msg
当由于一个信号而被终止时的信息。
CHILDSTATUS pid code
当一个子程序以非0值退出时的格式。
CHILDSUSP pid sigName msg
当一个子程序由于一个信号而被终止时的格式。
NONE
错误没有附加信息。
UNIX errName msg
当一个内核调用发生错误时使用的格式。

errorInfo
包含了一行或多行的信息,描述了错误发生处的程序和信息。

原文的作者也是Tcl的缔造者 John Ousterhout

Tcl简介(三):Tcl 内建命令

Tcl 名字空间

namespace
创建和操纵命令和变量的上下文(content)。

简介:
一个名字空间是一个命令和变量的集合,通过名字空间的封装来保证他们不会影响其它名字空间的变量和命令。 Tcl 总是维护了一个全局名字空间 global namespace 包含了所有的全局变量和命令。

namespace eval允许你创建一个新的namespace。
例如:
namespace eval Counter {
namespace export Bump
variable num 0

proc Bump {} {
variable num//声明局部变量
incr num
}
}
名字空间是动态的,可变的。
例如:
namespace eval Counter {
variable num 0//初始化
proc Bump {} {
variable num
return [incr num]
}
}

//添加了一个过程
namespace eval Counter {
proc test {args} {
return $args
}
}

//删除test
namespace eval Counter {
rename test ""
}
引用:
set Counter::num
//return 0
也可以用下面的方式添加:
proc Foo::Test {args} {return $args}
或在名字空间中移动:
rename Foo::Test Bar::Test

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/danforn/archive/2007/06/25/1665930.aspx

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值