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根据格式描述符解析字符串并赋值给后面的变量,返回成功转换的个数
浙公网安备 33010602011771号