这里写目录标题
- 语法
- 赋值(或者说替换)
- $
- []
- \
- 引用
- \和“”、{}
- 匹配
- exact、glob
- 正则表达式
- 变量
- 简介
- string
- 语法、match选项
- equal、compare
- length、index、range
- replace、map
- trim(裁剪)
- 大小写转换
- repeat、reverse
- list
- 创建
- 语法
- llength、index、lrange
- linsert、lreplace、lset(插入、替换)
- lconcat、lappend、lrepeat、lassign(合并、追加元素、重复、将list_a的内容依次取出来赋值)
- 添加/修改分隔符
- lserch
- Array(数组)
- 表达式
- 简介
- 流控制
- if
- while
- foreach
- switch
- break/continue
- 函数
- 基本结构
- 其他三种写法
- 补充(参考)
- 文件
- 文件读写
- 文件操作
- 常用命令
语法
赋值(或者说替换)
$
set 变量名 值
其中,值可以是常量,如上图的12,也可以是从变量中拿到的值,如上图中的$a
注意,如果变量名不是由字母数字和下划线组成的,那么在$时,要将变量名加上花括号
[]
expr是计算表达式的值,
语法:
expr 1+2
expr $a + $b
[]是返回命令执行的结果,多用于赋值和条件判断
补充:如果使用[glob *v]本意是想拿到所有以v结尾的文件,但是虽然他确实返回结果是a.v b.v c.v,但是他将这三个.v合并成了一个变量进行返回,当前目录并没有名为“a.v b.v c.v”的单个文件,所以,这里想要返回三个变量,需要在前面加{星}
这一点类似于shell里面的$星 和 $@
\
\是转义字符,将一些特殊字符当成字面量输出
引用
\和“”、{}
引用:在tcl中的引用,表示的是可以阻止解释器对一些特殊字符(即在tcl中视为命令的字符,将其按照字符串输出其字面量,也就是直接输出他自己,不让其执行命令功能)
1、反斜杠:
第一,他可以进行转义,将一些特殊功能的字符,当成字符输出
第二,当我们写命令时,一行写不下的话,可以在后面加上 +\,之后换行写后续的命令,这表示下一行的命令跟上一行是同一行命令(需要注意的是,\后面不能有空格)
2、强引用与弱引用:
弱引用:使用双引号引起来,里面可以进行特殊字符的使用
强引用:只要是被强引用引起来的,都要被视为字符串,进行输出,特殊字符丧失功能变为普通字符
匹配
exact、glob
exact是严格匹配,即两边内容必须严格一致,才会匹配的上
而glob则是模糊匹配,可以使用一些通配符进行模糊匹配,如上图的表格,(注意,这些通配符是glob自带的,不是正则表达式,可以会有一些与正则表达式有不同的含义)
正则表达式
更多的正则表达式可以去以下网站:
变量
简介
string
语法、match选项
语法:string 【option】 参数1 参数2 参数3 … 参数n
match:
string match 参数1(glob通配符形式) 参数2(字符串)
该语法的意思就是,将参数1和参数2进行匹配,其中参数1是通配符,如果匹配上了,则返回1,否则0
而用两个问号括起来的-nocase,表示可选项。如果加上了nocase,则表示不区分大小写
equal、compare
string equal string1 string2
用于比较两个字符串是否相同,且这种比较是严格比较,必须完全相同,当然可以选择加上可选项:-nocase
以及-length x 选项,这个选项表示比较前x位字符
string compare string1 string2
这个参数也是严格比较,但是注意与equal的返回值有所不同,首先他相同的话返回0,不同的话他会根据不同的那个字符的字典序返回1或者-1
当然,他也可以选择可选项
length、index、range
length:string length string1
返回字符串的长度,字符串如果有空格、转义字符(算一个字符),可以使用双引号包起来
index:string index string1 charindex
返回字符串的索引字符,索引从0开始,且charindex有三种表示方法,如上图
(注意:end表示最后一个元素,end-x,表示不算最后一个元素,倒数第x个元素)
range:string range first last
返回字符串的一个区间
(first如果小于0,则按0处理)
replace、map
replace:如上图,可以将某个区间的字符串进行替换,如果不指定替换的新字符,则意味着进行删除操作
map,设置key-value,将字符串中的key替换为value
trim(裁剪)
裁剪:
tcl里面的裁剪很有意思:
格式:string trim string1 字符组合
从string1的两边开始,需要字符组合中的任意一个字符,就会将其裁掉,知道遇到没有出现在字符组合中的字符,就会停止
而trimleft、trimright,分别表示从左边开始和从右边开始
大小写转换
repeat、reverse
list
创建
语法
列表与string不同的是,他的选项在最前面,且列表名大部分需要在前面加$
语法:
【option】 $list 参数1 参数2 参数3… 参数n
llength、index、lrange
检索时,元素下标从0开始
linsert、lreplace、lset(插入、替换)
注意:向list 插入时,要对list变量进行$取值,才能插入,而对列表某个位置进行替换时,则不需要对列表名进行 $,如上图的lset
(set a {a b c d}是创建a列表,列表元素是a、b、c、d,这是创建列表的一种方式之一)
但是对某个区间进行替换时,仍然恢复成需要加 $
区间替换时,如果不加新的替换内容,则是删除操作(注意只能是区间替换)
lconcat、lappend、lrepeat、lassign(合并、追加元素、重复、将list_a的内容依次取出来赋值)
lappend追加时,也不需要$
而lrepeat重复时,结构有所变化,参数与$list 交换了位置
添加/修改分隔符
用问号括起来的是我们要设定的新的分隔符,如果分隔符不止一个字符,如上图第一个用紫线画出来的,就要用双引号引起来。
使用join命令可以修改新的分隔符,同时实现了list–>string的转换
使用split命令可以将分隔符删去,同时实现了string–>list的转换
lserch
在终端敲入man lsearch,可以看到详细介绍
lsearch使用时,会有许多自己的选项,这些选项如果需要添加,则加在lsearch后面。
常见的选项有,控制匹配方式,控制返回元素还是元素索引,控制返回第一个匹配到的元素还是所有匹配到的元素
Array(数组)
上图中的,
set color(red) 1
set color(green) 2
set color(blue) 3
实际上就是在创建一个名为color的数组,该数组实际上是键值对集合,即输出color(red)会得到1,输出color(green),会得到2
array names color:拿到所有的键
array get color:拿到所有的键值对
array size color:拿到数组的大小
表达式
简介
想要计算出表达式的值,要使用expr,且计算时如果不是常量,都进行$进行取值,而如果想要将计算结果赋值给一个变量,则要在最外层加上[]
注意,上图右边那个表中列出了运算符对应的操作数的类型,如上图,%运算符只能操作int,不能操作double
流控制
if
注意点:
1、如果逻辑表达式作为条件,则表达式前面不需要加expr
2、if 和 { 要在一行,包括elseif 和 {也要写在一行
3、各部分之前要有空格分隔
其中第二个if在}的左边少了一个] ,由此可以看到,对于条件判断,想要拿到某些命令的值,需要在外面加[],且对于条件判断来说,逻辑表达式不需要expr
但是对于计算表达式,还是加上expr为好,同时需要[]来得到计算结果,例如if {[expr $a + $b] > 3} {
while
foreach
增强for循环,
第一种用法,就是上图最上面的用法,很常见,实际上就是增强for
其他用法:
如上图下面的用法,有i j 依次取列表中的元素,也有i j 各自取各自的列表,然后依次输出自己列表的元素
switch
switch的基础语法:
switch $待匹配变量 {
选项1 {执行语句}
选项2 {执行语句}
}
而switch有几个option可选,默认情况下,他是exact匹配,也就是严格完全匹配
加了-glob,就可以实现模糊匹配
加了-regexp,则表示进行正则表达式的匹配
补充:
1、incr x,表示将x进行+1
2、正则表达式中,执行-,表示执行下一个选项的函数体
break/continue
函数
基本结构
proc是函数定义命令,
而函数体内的global,表示声明变量,有了该语句,才可以在函数体内调用a变量
其他三种写法
第一种:加一个参数,用于选择使用加法还是乘法
第二种:默认参数,{参数 默认值},注意,此时默认参数必须在最后一个
第三种:参数最后面加上args,可以实现可变参数
补充(参考)
可以通过上图这种方式,从而为我们自己的函数设置help文档,到时候可以使用函数名 -help,来查看我们写的帮助文档
在写上上图代码之前,要写上图最上面那条语句,即,先将command group定义出来,可以使用list_command来验证是否创建成功
最后source生效一下,可以使用help 查看某个comman group中包含的函数
文件
文件读写
打开文件有许多的权限,如上图右上角的表,查阅即可
set handle [open 路径 打开方式]
该句的意思是,将[ ]中命令的执行结果或者返回值拿到,然后赋值给handle,此处可以认为拿到了句柄(文件套接字)
而上图框出来的代码逻辑是:
循环判断是否到了文件末尾,如果没有,则进入循环,
读到文件的一行,给到变量line
判断该行是否可以模糊匹配VIOLATED,如果可以,输出该行(line变量的内容)到写文件(write_handle)内
文件操作