背景:TCL语言基础知识积累
1. 入门书籍推荐
- Tcl/TK入门经典(第二版)
- The power of Tcl 1
2. 语法规则
(1)命令处理
a. 脚本由一条或多条命令组成
b. 命令由换行符或者分号隔开
c. 每条命令包含一个或多个单词,由空格或者制表符隔开,第一个单词为命令名,其他单词为参数。
d. 使用#号进行注释。
(2)替换
tcl中总共包含三种变量替换方式:变量替换$,命令替换[]和反斜杠替换\
a. 变量替换$ ,示例:
#给变量a赋值为1,再把变量a的值赋值给b set a 1; set b $a;
注意:替换的变量名由$后面的所有字母、数字和下划线组成,故遇到非字母、数字和下划线会终止。
b. 命令替换[] ,示例:
#把1+2的结果赋值给a,[]中的内容作为命令执行,且返回执行的结果。 set a [expr 1+2]
c. 反斜杠替换(转义),示例:
#将 $ 赋值给a set a "\$"
(3)引用
- TCL语言提供了一些方法,阻止解析器对$和分号等特殊字符进行特殊处理,这些方法称之为引用。常用的引用包括反斜杠、双引号和大括号。
- 反斜杠阻止了 $ 的替换,将$ 解析为字符$。
强引用{}和弱引用""
a. 强引用{}:大括号去掉其中所有特殊字符的特殊解释。即大括号中的字符串将按照字面上的意思,将字符赋值给变量。可以嵌套使用。
b. 弱引用"":双引号去掉单词和命令分隔符的特殊解释,在双引号内部的[]依然有效。不可嵌套使用。
> set price 5 5 > set aa "egg price is \$$price " egg price is $5 > set aa {egg price is \$price } egg price is \$$price
3. 三种匹配方式
Tcl语言中存在三种匹配方式:exact 、 glob 和 正则表达式
a. exact :严格匹配,指两个字符串必须完全相同,不匹配通配符。
b. glob :通配符匹配
c. regexp:正则表达式匹配
4. 变量
- 无需声明定义,直接使用set进行创建,unset移除。变量包含变量名和变量值。
- 使用 $ 进行调用。
- 区分大小写。
- 变量名和变量值都可以由任意字符组成,建议使用字母开头,使用字母数字下划线进行命名。
- 常用的变量类型:string list array directionary collection
- 变量存储类型分为字符串表打形式和内部表达式形式(整数,实数,名称,列表以及tcl脚本)
(1)string命令
如果你想要把某个简单变量当字符串处理/看待,可以使用string命令提供的功能;
语法格式:
string opting arg? arg...?
string 命令具有强大的字符串的功能,其中option的选项多达20个,下面我们介绍常用的部分。
a. match:匹配
支持通配符匹配。常用参数 -nocase不区分大小写。示例:
#语法:string match pattern string1
#如果pattern 匹配string1 返回1。
> string match *i* fadfifdafda
1
string match -nocase {*[0-9]} fadfifdafda
0
b. equal:等于
exact匹配方式,不支持通配符,两个字符串进行等于比较。示例:
# string equal -nocase -length 5 string1 string2
# 对string1和string2进行比较,如果他们严格(exact)相同,返回1,否则返回0 ,-length 指定字符串从前往后匹配长度。
> string equal -length 5 fffghk fffghj
1
> string equal fffdddss fffdddss
1
c. compare :比较
两个字符串进行比较,示例:
#语法:string compare string1 string2
#两个字符串进行比较,如果严格相同,则返回0;如果第一个字符串先于第二个字符串返回-1,否则返回1。
> string compare icss2019 icss2020
-1
> string compare icss2020 icss2020
0
> string compare icss2020 icss2019
1
d. length:长度
返回字符串的长度,空格换行也算一个字符。
# 语法:string length string
>string length fdfdf
5
> string length "fdfd f"
6
>string length "fdfd f\n"
7
e. index : 索引
返回字符串索引所对应的值。示例如下:
#语法: string index string1 charIndex
#返回string1 中charIndex所对应的字符。charIndex可以是以下的值:
#整数n:第n个字符
#end:最后一个字符
#end-整数n:倒数第n个字符。
#注:如果charIndex小于0或者大于字符串长度,返回空。
> string index strdsf 4
s
> string index stridfg end-4
r
f. range:范围
返回规定范围的字符串。
#语法:string range string1 first last
#返回字符串string1 first到last之间的字符串 ,如果first或者last小于0,则按照0处理
> string range indffcg 0 end-4
ind
> string range indffcg -2 end-4
ind
g. replace 替换
字符串替换
#语法:string replace string 1 first last newstring
#使用newstring 替换first到last位置的字符,如果呢我string不存在,则将first到last之间的字符串删除,如果first比last大,则不进行替换。
> string repalce abcdef end-3 end jjjj
abjjjj
> string replace abcdef end-3 end
ab
> string replace abcdef 3 2 cc
abcdef
h. map:顺位置换
将字符串中的关键词置换为响应的值。
#语法:string map {aa AA} string1
#将字符串中aa置换为AA
> string map {ab ddd} abcdefg
dddcdefg
> string map {ab dd g v} abcdefg
ddcdefv
i. repeat : 重复
重复字符串n次
#语法: string repeat string1 count
#将字符串string1重复count次
> string repeat * 15
***************
(2)list命令
list 列表,列表元素一空格分隔,创建列表三种方式:
set list_a "a b c"
set list_a {a b c}
set list_a [list a b c]
list常用命令与string命令相似,示例如下:
a. llength : 长度,返回list元素个数。
>set list_a "a b c"
>llength $list_a
3
b. index:索引,返回索引所对应的元素
>set list_a "a b c"
>lindex $list_a 0
a
c. lrange : 索引范围
>set list_a "a b c"
>lrange $list_a 0 1
a b
d. linsert : 在指定位置插入新元素
>set list_a "a b c"
>linsert $list_a 1 gg
a gg b c
e. lreplace : 列表元素替换
#将list_a位置1到2的元素替换为ff gg hh:
>set list_a "a b c"
> lreplace $list_a 1 2 ff gg hh
a ff gg hh
#删除list_a 位置1的元素
>set list_a "a b c"
> lreplace $list_a 1 1 c
a c
f. lset : 将变量指定位置的元素替换为指定值
>set a {a b c d}
>lset a 2 7
a b 7 d
g. lconcat : 将不同的列表合并为新列表
>set list_a "a b c"
>set list_b "d e f"
>concat $list_a $list_b
a b c d e f
h. lappend : 列表添加新元素
>set list_a "a b c"
>lappend $list_a d
a b c d
5. 表达式
expr命令:数学运算
> set a 1 > set b 2 >expr $a+$b 3
6. 流控制
(1) if
#语法格式:
#if expr1 body1 elseif expr2 body2 ... else expr3 body3
示例:
if {$x < 0} {
...
} elseif {$x == 0} {
...
}
else {
...
}
注意:
- { 一定要写在上一行,否则TCL解析器就会认为if在换行符处已经结束,下一行会当成新的命令,从而导致解析器报错。
- if 和 { 之间要有一个空格,否则TCL解析器会把他们当作一个整体导致报错。
(2)while
#语法格式:
# while expr body
#当expr表达式满足条件,则执行body中的命令,否则停止循环并返回一个空字符串。
#示例,计算0-100的总和:
set i 0
set sum 0
while { $i <= 100 } {
set sum [ expr $i + $sum ]
incr i
}
(3)foreach
#语法格式:
#foreach varname list body
#varname是一个变量,list是一个列表,body是循环体。
#示例:
set list_a {a b c}
foreach i $list_a {
...
}
(4)switch
#语法格式:switch options string pattern1 body1 ... pattern(n) body(n)
#可选参数options,表示匹配的方式。switch目前支持三种匹配方式:-exact(默认)严格匹配方式,-glob通配符方式,-regexp正则表达式方式。
(5) break/continue
#break:中断循环。
#continue:终端本次循环,继续下一次循环。
7. 函数
8. 文件操作
9. 常用命令
- exec : 用于执行shell命令
- redirect: 重定向
- regexp:正则匹配
- cd: 进入目录
- pwd:当前路径
- set:置换
- puts:输出
- echo:输出
- info:信息处理
请问 这是什么程序源码啊