文章目录

  • TCL基本入门
  • append的用法
  • incr的用法
  • 常见列表
    • llength:返回一个列表的元素个数
    • lindex :返回索引值对应的列表元素
    • lrange:返回指定区间的列表元素
    • lassign:将列表元素赋值给变量
    • lappend 在原列表后面添加元素
    • lreplace列表元素替换
    • lset 列表元素设置
    • linsert 在指定索引值的列表中插入新值
    • lsort:对列表内的元素排序
    • lreverse:反向列表
  • TCL控制流
    • if命令
    • 循环命令:while、for、foreach
    • eval命令
  • source -e -v
  • 提示
  • 参考文章:

从业IC的人员都知道tcl语言对于测试人员或者说设计人员都是非常重要的一门语言,为了建立更好的自动化测试环境,我们可能不仅仅是只需要了解那份执行的scripts,也可能需要知道环境里面的scripts,而里面必然涉及到一些选择语句等等,如果能把tcl的知识掌握好,然后再去做几个测试练习,最后,自己动手写几个脚本,再带着这样的思想去揣摩工作中的环境,想必能力上会有更好地提升。
tcl系列博文,将为这些能力打下一个基础前提。分为三篇: 基础篇练习篇实际项目篇

TCL基本入门

TCL解释器对一个命令的求值分为了:分析和执行
分析:把命令分解为独立的单词,进行必要的置换动作。
执行:把第一个单词当做命令,查看这个命令是否有定义,有的话激活其对应的内部动作。

置换分了了三种:
1、变量置换 $
2、命令置换 [ ]
3、反斜杠置换

解释:

%set x 10
%set y [expr $x + 100]

y的值是110,当TCL解释器遇到字符 【 ,它就会把随后expr作为一个命令名,从而激活expr对应的动作,如果我们去掉【 】,TCL会报错,正常情况下只把命令行中的第一个单词作为命令,注意【】中必须是一个合法的TCL脚本,长度不限。【】中的脚本的值为最后一个命令的返回值。

%set y [expr $x+100;set b 300]//y 的值为300

反斜杠置换中,在单词符号中插入换行符、空格、【、$等被TCL解释器当做特殊符号对待的字符。

双引号和花括号:
TCL解释器对双引号中的各种分隔符将不做处理,但是对换行符、以及$ 和【】两种置换符会照常处理。

%set x 100
100
%set y "$x ddd"
100 ddd

在花括号中,所有特殊字符都将被成为普通字符,失去特殊意义。

%set y {/n$x [expr 10 +100]}
/n$x [expr 10 +100]

数组

数组不需要声明,直接赋值即可,也不必按照顺序来:
set i(1) 123 ; set i(16) hi
当然也支持任意维数的数组:
set i(1,2,3) hi
引用的时候直接$i(1,2,3)即可

set与unset
一个是设置变量,一个删除变量。

append的用法

append的目的是将新的单词追加到原来旧的变量后面,而不是像set那样去替换原来这个旧的变量。

1)
% set x hello
hello
% set y world
world
% set x "$x$y"
helloworld
2)
% set x hello
hello
% set y world
world
% append x $y
helloworld

所以我们常可以看到dc里面设置search_path的时候,我们会用append,而不是用set去替换。

incr的用法

incr后面跟两个数,第一个参数为变量名,第二个参数为整数(默认为1),incr的目的就是将这个整数的值加到这个变量名的值上面,然后将结果存储到这个变量名中。
相当于a=a+number,值得一提的是不管是a还是number都必须要是整数,不可以为小数。

(1)
% set a 16
16
% incr a 2
18
% incr a -5
13
% incr a
14
% incr a 011
23
% incr a 0x11
40
(2)
% incr x 5
5
% incr y
1
(3)
% incr x 2.3
expected integer but got "2.3"
% set x 2.3
2.3
% incr x 2
expected integer but got "2.3"
解析:incr 的第一个参数必须是整数变量,第二个参数必须是整数。

常见列表

列表作为TCL中的一种重要的数据结构:
1、使用{ }创建

%set a {Hello FPGA!}
Hello FPGA!

2、通过list进行创建
因为list本身就是一个TCL,因此与set一起使用的时候就要用到命令置换符【】

%set b [list Hello FPGA!]
Hello FPGA!

3、通过contact命令创建列表
contact的参数可以使任意多个列表,从而实现列表的拼接

set c [contact $a $b]
Hello FPGA! Hello FPGA!
%set  d [contact {} {b c} {d}]
b c d

4、通过lrepeat命令创建列表
lrepeat命令接收两个参数,第一个参数是重复次数,第二个参数是重复值。

%set m [lrepeat 4 "**"]
** ** ** **

5、创建空的列表
空的列表不包含任何值,通常用于列表的初始化。可以通过{},也可以通过list创建空列表。

%set p {}
llength $p
0
set q [list]
llength $q
0

创建列表的方法有很多种,但list是最常见的。
另外上面介绍的列表除了创建一个新的列表,还有基于列表为元素的,这里我将其分开。
基于单词元素和列表元素的有: { } 、list、lrepeat
其余都是基于列表元素

list与contact的区别:
concat是去掉了一层列表结构后,再组合所有的元素

llength:返回一个列表的元素个数

llength list

lindex :返回索引值对应的列表元素

元素的下标从0开始算起。如果没有index参数就返回整个列表,如果index对应的元素还是一个列表就返回对应子列表中的元素。

lrange:返回指定区间的列表元素

lrange list first last

返回列表list一个区间的元素,区间由first和last指定

lassign:将列表元素赋值给变量

lappend 在原列表后面添加元素

lappend命令接收一个变量名(列表名),将元素添加到原列表后面

lreplace列表元素替换

lset 列表元素设置

lset和lappend一样接收一个变量名作为参数,也会修改变量的值,将列表中的指定索引元素修改为指定的新值,如果不指定索引项就把整个列表换成新值。

linsert 在指定索引值的列表中插入新值

在索引位index的前面插入元素,产生一个新的列表

lsort:对列表内的元素排序

lsort ?options?list


1)按照ASCII码的顺序排序,是默认状态。

2)按照字典顺序排序。

3)按照浮点数排序,要求列表里面的元素都能够正确的转化为浮点数。

4)按照整数排序,要求列表里面的元素都能够正确转化为整数.


1)-increasing 按照升序排列

2)-decreasing 按照降序排列

3)-indices 返回排序后的元素在原列表中的索引

4)-nocase 忽略大小写

lreverse:反向列表

返回一个列表,新的列表为原列表的反序形式。

TCL控制流

if命令


注意, { 一定要写在上一行,因为如果不这样,TCL解释器会认为if命令在换行符处已结束,下一行会被当成新的命令,从而导致错误的结果。书写中还要注意一个问题是if和{之间应该还有一个空格,否则TCL解释器会把 “if{” 作为一个整体当做一个命令名,从而导致错误。

循环命令:while、for、foreach

while

for

foreach
主要功能是遍历列表中的元素。
主要用法有三种形式:
1、

 % foreach var {a b c d e f} {puts $var
}
a
b
c
d
e
f

2、
可以对列表进行多个元素一起赋值,这时varname是一个n个元素列表结构,每次遍历list列表中的n个元素赋值给以varname列表元素为名称的变量。

 % foreach {var1 var2 var3} {a b c d e f} {puts "$var1 $var2 $var3"
}
a b c
d e f

3、
遍历多个列表中的元素,这里举例以varname为单个元素为例:

 % foreach var1 {a b c} var2 {d e f} {puts "$var1 $var2"
}
a d
b e
c f
如果元素不足那么会以空来补充:
 % foreach var1 {a b c} var2 {d e} {puts "$var1 $var2"
}
a d
b e
c

可以利用这个技巧给变量赋值,比如把一个列表中的前3个元素分别赋值给

var1、var2和var3:% foreach {var1 var2 var3} {a b c d e f} {break;}% puts "$var1 $var2 $var3"a b c

\ 仔细体会一下break的妙用吧。

eval命令

eval是调用一个TCL脚本

eval arg ?arg...?

如果是一个参数,那么相当于把这个参数当做命令来执行
如果有多个参数,eval命令会把多个参数以concat命令风格连接起来然后再执行命令。

source -e -v

-e代表echo
-v代表verbose
好文:
https://my.oschina.net/u/4579346/blog/4426952

-e代表echo执行了哪些cmd
-v代表每一行cmd执行的结果。

https://blog.csdn.net/icxiaoge/article/details/102770805

提示

在资料中你也许经常会碰到 ?的书写方法,影响你的阅读体验

例如下图:

参考文章:

https://blog.csdn.net/long_fly/article/details/78897158?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-6&spm=1001.2101.3001.4242

http://m.elecfans.com/article/817355.html

https://blog.csdn.net/dongyanxia1000/article/details/50682376

https://blog.csdn.net/dulixin/article/details/2410015

https://blog.csdn.net/dulixin/article/details/2410030

https://my.oschina.net/u/4579346/blog/4426952

https://blog.csdn.net/icxiaoge/article/details/102770805

TCL基础篇---基本语法(持续更新)相关推荐

  1. 《锋利的jQuery》学习---基础篇01(持续更新)

    书是公司买的,借过来看看,感谢公司,其实我电脑里有这本书的电子书,但是发现自己越来越不喜欢用电脑看书了,严重费眼睛. 嘿嘿,看来这是要逼着我买kindle呀.好了,现在有书,废话不多说,从最基础的开始 ...

  2. java玩转区块链-基础篇-solidity语法-基础类型

    java玩转区块链-基础篇-solidity语法-基础类型 java环境配置 代码准备 maven 完整solidity 执行步骤 基础类型 布尔类型 类型标识: 字面常量值: 运算符: 短路规则: ...

  3. 第二课 基础篇_SQL语法

    第二课 基础篇_SQL语法 一.通用语法 1.SQL语句可以单行或多行书写,分号结尾. 2.SQL语句可以使用空格或缩进增强语句的可读性. 3.MySQL数据库库的SQL语句不区分大小写,关键字建议使 ...

  4. javaSE基础重点知识点总结 持续更新

    javaSE基础重点知识点解析 文章目录 javaSE基础重点知识点解析 前言 1.重载和重写 2.匿名对象 3.可变个数形参的方法 4.MVC设计模式 5.java.lang.Object类 6.自 ...

  5. 猴子都能懂得Git(入门篇汇总版)持续更新中~~~

    文章目录 前言 一.Git的基础 1.Git是什么? 2.管理历史记录的数据库 远程数据库和本地数据库 创建数据库 修改记录的提交 工作树和索引 2.安装Git 初期设定 新建数据库 提交文件 pus ...

  6. 渗透学习-文件上传篇-基础知识部分(持续更新中)

    提示:仅供进行学习使用,请勿做出非法的行为.如若由任何违法行为,将依据法律法规进行严惩!!! 文章目录 前言 一.文件上传漏洞简要阐述 文件上传是什么? 为什么会产生文件上传漏洞?及其可能一哪些危害? ...

  7. javaScript常用语法(持续更新)

    一.数据类型 1. 原始数据类型(8个) number, string, boolean, undefined, null, symbol, bigint, object 1.1 number包括以下 ...

  8. 计算机基础面经积累---持续更新

    1.gcc,g++,gdb常用命令 首先了解gcc,g++的区别.要先知道我们写的源代码是如何被编译器运行的.大概有四个阶段: 预处理:处理宏定义等宏命令,删除空格等,生成后缀为".i&qu ...

  9. MySQL基础学习笔记(持续更新中)

    一.MySQL基础 1. 数据库概念 1.1 为什么要学MySQL 个人理解:随着互联网的发展,数据变得烦杂,冗余,量大,为了保证数据的持久性以及健壮性等等,同时也为了方便人们很好的处理数据,这就发明 ...

最新文章

  1. php7伪静态 源码,PHPWind 8.5和8.7版的伪静态.htaccess规则
  2. scala array 删除元素_Array中some介绍
  3. JSP实现网上招标系统
  4. 赠书:亿级流量峰值没在怕,“缓存”技术来减压!
  5. requestAnimationFram
  6. excel显著性检验_数据分析系列 10/32 | Excel方差分析之单因素方差分析
  7. PostgreSQL | 学习笔记语句汇总
  8. React Router 全部
  9. AntennaHome Launch 5G Combo Internal PCB Antenna /5G 全频 PCB天线
  10. 【马克思主义基本原理】--第一章--【世界的物质性及发展规律】
  11. 移动端网站优化需要具备哪些条件
  12. CCF计算机职业资格认证考试资料 部分题目答案 题库
  13. 通过fileProvider接收外部App传递文件路径的一些坑
  14. 杠杆炒股亏损多少就会被平仓?
  15. Excel合并多个有文本的单元格
  16. 面试中一些较为复杂的常见的算法
  17. 田亮晒森碟与海豚亲吻照 父女开心超有爱
  18. Java pta练习题 第一章
  19. QGIS常用图源(谷歌中国、mapbox、esri、天地图等)(weixin公众号【图说GIS】)
  20. 用Scratch绘制正多边形

热门文章

  1. selenium python (七)层级定位(二次定位)
  2. 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息]
  3. Android实现点击事件的4种方式
  4. cyico收集的关于utf8转换gb2312,以及关于javascript实现urlencode和urldecode的一些方法...
  5. 矩阵分析与多元统计 线性空间与线性变换2
  6. 初次使用VS附加到进程功能
  7. Java LinkedList类基本用法
  8. Tomcat学习总结
  9. asp.net ashx 学习总结
  10. 阿里云ACE共创空间——MQ消息队列产品测试