TCL语言基础

背景: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. 函数

7.png

8. 文件操作

8.png

9. 常用命令

  • exec : 用于执行shell命令
  • redirect: 重定向
  • regexp:正则匹配
  • cd: 进入目录
  • pwd:当前路径
  • set:置换
  • puts:输出
  • echo:输出
  • info:信息处理
TCL
打赏
文章目录