• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
dzw9
博客园    首页    新随笔    联系   管理    订阅  订阅
TCL

TCL

tool command language

1.基本语法

Tcl中句与句之间以换行或分号分隔。在一个语句中,通过空格来分隔语句的不同部分;

tcl脚本依赖于解释器,逐行执行

#!/usr/bin/tclsh 
puts "Hello world!";  #puts输出,解释必须先以分号结束语句。如果每行只有一个语句,则分号不是必须的。
#如果一行中只包含空格、注释,则会忽略该行。

set x 1;			#定义变量 x=1
set y 10 + x;		#返回 10 + x 而不是11,tcl把所有参数都当做字符串
set y 10 + $x;		#返回 10 + 1 而不是11,通过$变量置换
set y [expr 10+$x];	#返回11,expr计算10+1
set msg qq\ oo;		#返回qq oo,\反斜杠转义空格,‘qq oo’被认为是一个整体

set x.1 8;	#名字和值可以是任何字符串
set y $x.1;	#返回1.1,tcl把$符合到不是字母数字下划线之间的字符当做置换变量名字,这里是.
set y ${x.1};	#使用花括号作为整体,返回8
set y "$x ddd"	#返回 1 ddd,双引号会处理换行符、$和[]置换符,不处理分隔符

set day(mon) 1; set day(tue) 2;	#数组只能和数组元素同时声明,mon=1
unset x y day(mon);	#删除变量,可以跟多个参数

set txt huawei;
append txt"hongmeng";	$append把文本添加到变量后面
incr x 5	#结果为1+5=6
incr x-1	#0
incr x		#默认自增1,1+1=2

#list集合
set list1 [list 1 2 {3,4}];	#创建集合list1
concat {1 2} {3 4};	#整合两个list为{1 2 3 4}
lindex  {1 2 {3 4}} 2;	#返回元素2,{3 4}
llength {1 2 {3 4}};	#返回元素个数3
linsert {1 2 {3 4}} 1 5 6;	#在元素1前面插入,{1 5 6 2 {3 4}}
lappend a 1 2;	#添加列表元素,1 2 
lappend a [list 3 4];	#添加的元素为列表,1 2 {3 4}

#控制流 if condition body1 else bodyn
#tcl先把condition当做表达式求值,若值非0,则执行body1并返回值,否则执行test2
if {$x>0} {		#这里{必须写在上一行,不然tcl会认为if命令在换行已经结束了
....			#if和{之间必须有空格,不然会把if{当做整体
} elseif {$x==1} {
....
} else {
....
};	#

#循环while condition body 直到condition为0才停止循环
#循环for init condition reinit body
#foreach var变量 list集合 body
foreach i $a {
set b [linsert $b 0 $i]
}

#switch options匹配方式 string
#options可选项 默认为-glob,和字符串match相同  -exact精确匹配 -regexp正则表达式匹配

#break结束整个循环并跳出循环,continue结束本次循环
#source读取一个文件并作为脚本求值
eval set a 1;set b 2;	#eval构造和执行tcl脚本命令

#过程proc 类似函数
proc add {x y} {expr $x+$y}; 	#过程名字 参数 命令
puts "1+2= [add 1 2]\n";			#3,puts中使用[]调用add

set a 2
proc sample {x} {
upvar $x temp		#定义局部变量temp为x
global a
incr a
return [expr $a+$x]
};		#使用global在过程内部引用全局变量,过程中定义的变量为局部变量
sample 3;		#x=3,返回6
set a;			#a=3


set name dzw; set age 26;
set msg [format "%s is %d years old" $name $age];	#使用format命令格式化
scan "add 12 34" "add %d %d" a b;		#scan为format的逆命令,把12存到变量a中

#文件访问
r只读,文件必须存在,默认方式;r+读写,必须存在;w只写,若存在清空内容,不存在就创建;
w+读写;a只写,必须存在,指针指向文件尾;a+读写,不存在就创建。
文件标识:stdin标准输入,默认stdout标准输出,stderr错误通道
open命令返回一个字符串用于标识打开的文件,gets、puts、close操作时调用

pwd返回当前路径;cd切换路径

glob *.c *.h;	#glob返回文件列表
file delete {*}[glob *.tmp];		#使用参数展开语法{*}把列表元素作为独立参数提供给指令
eval file delete [glob *.tmp]
file atime license.txt;		#返回文件最后访问时间,十进制

set x 1.2e+10
expr double($x)+2  #科学计数法先用double转换
#过程
proc get_area {} {
	set area 0
}
define_proc_attributes get_area


布尔值:字符串0、no、flase、off为假,字符串yes、true、on和非0的数字字符串,包括科学计数法表示的数值为真。
{}:大括号中的内容作为一个整体,但大括号中的$、[]与\不会被展开或转义

\:转义字符,将特殊字符转为可见字符,如“$”、“\”

字符 输出 十六进制
\a 响铃 \x07
\b 回车 \x08
\f 清屏 \x0c
\n 换行 \x0a
\r 回车 \x0d
\t 制表符 \x09
\v 垂直制表符 \x0b
\ddd 八进制 d=0-7
\xhh 十六进制 h=0-9,A-F,a-f

4. 字符串

4.1 append 追加到字符串尾

append varname value?

set var1 hello
set var2 world
append $var1 $var2
puts $var1		#helloworld

4.2 format 格式化字符

format spec value1 value2
spec使用%开始,添加修饰符,以格式转换符结尾

修饰符 说明
- 左对齐
+ 右对齐
space 在数字前加空格
0 使用0填补空白
# 添加前缀0x十六进制 0八进制
格式转换符 说明
d 有符号整数
u 无符号整数
i 有符号整数,变元可以是 0x十六进制或 0八进制
o 无符号八进制数
x或X 无符号十六进制数
c 将整数映射到对应的ASCII字符
s 字符串
f 浮点数
e或E 科学计数法表示的浮点数
g或G 以%f或%e格式表示的浮点数,要短一些
set res [format "%2\$s" 1 5 9 ]			#5
set str [format "%3\$s %1\$s %2\$s" "are" "right" "you"]	#you are right

format "%x" 20		#14
format "%8x" 20		#	14	8位数据宽度,右对齐
format "%08x" 20	#00000014
format "%-8x" 20	#左对齐
format "%#08x" 20	#0x000014

4.3 scan命令

scan根据格式描述符解析字符串并赋值给后面的变量,返回成功转换的个数

posted on 2023-05-14 20:52  dzw9  阅读(116)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3