zoukankan      html  css  js  c++  java
  • 【转】TCL语法简介

    1,脚本构成

    set a 2
    set b 3
    //
    set a 2;set b 3

    TCL脚本可以包括多个命令,命令间使用换行符或者分号分开,一个命令使用空格分开命令、变量等其他参数。

    2,置换

    • 变量置换

      

    set c $a+$b //c = a+b=2+3

    使用美元符号$进行变量置换,上式中c=2+3而不是5,要让c=5需要使用命令置换。

    • 命令置换

      

    set c [expr $a+$b]

    当使用[]时,括号内第一个字符会当做命令,后续的作为命令参数,expr命令用于进行表达式求值。对求值结果进行返回并赋值给c。

    • 反斜杠置换

    使得特殊字符失去特殊含义

    set msg money $3333

    使用使用,上述空格不会被当做命令间字符分割处理,$也不会当做变量置换。

    • 双引号“”与花括号{}

    使用双引号“”和花括号{}也可以使得解释器将分隔符置换符等特殊字符当做普通字符。“”只是对分割符不处理,对换行符、变量置换$、命令置换依然会处理

    set y "$a xxx" //y -> 2 xxx

    使用花括号所有特殊字符都变成普通字符

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

    3,注释

    行首的‘#’符开始表示该行为注释。'#'必须出现在TCL解释器期望命令的第一个字符。因此'#'出现在行首及';'后后面内容才能当做注释。

    # this is a comment
    set msg "hello world!" ;#this is another comment
    set msg2 "nice day!" #error,this is not a comment

    4,变量

    TCL变量由名字和值构成,名字和值均可以是任意字符。要注意的是‘$’进行变量置换时是值得第一个不是字母、数字、下划线的字符之间的单词符号作为被置换变量名。使用set命令来设置变量,unset 命令取消变量。

    复制代码
    set a 2
    set a.1 4
    set b $a.1
    set c ${a.1}
    # b=2.1;c=4
    复制代码

    TCL的数组有点向python的字典,数组下标可以是任意字符串。

    set day(monday) 1
    set day(tuesday) 2
    set b $day(monday);#b=1

    unset删除变量

    unset a b day

    5,表达式
    TCL支持和C语言类似的运算符,和C类似的操作数,0777//八进制,0xff//16进制,8e10//8的10次方,和C语言一样,TCL也内置了很多数学函数。

    6,列表list

    列表是TCL重要的数据结构。list表示一堆元素的集合,元素可以是任意字符,包括list。

    {}
    {1 2 3 4 5}
    {1 23 3 {4 5}}

    1)list使用list命令生成列表,list 1 2 3 4

    2)使用concat list list...合并两个或多个列表

    3)lindex list index 返回list第index个元素,从0开始计算。

    4)llength list 返回list的元素个数

    5)linsert list index value value...返回新list,新list是把所有value插入到list第index个元素之前

    6)lreplace list first last value value...返回新list,把list第first个到last个元素用value参数替换,没有value参数则表示删除。

    7)lrange list first last 返回list第first到last个元素组成的串。last 为end则返回到串末

    8)lappend varname value value 把每个value附加到varname后面。

    9)lsearch -exact -glob -regexp list pattern 返回第一个匹配的元素索引,找不到则返回-1。-exact、-glob、-regexp是可选的3中模式匹配技术。

    -exact表示精确匹配;-glob和string match命令的匹配方式相同,-regexp表示正规表达式匹配。

    10)lsort options list 对list排序,通过options指定排序方式,有-ascii:缺省方式,按照ASCII字符顺序排序,-dictionary,按照字典顺序,字典顺序不考虑大小写,数字被当做整数排序。-integer,将list元素转换成整数,按照整数排序,-real,转换成浮点数排序;-increasing升序,-decreasing降序。-command cmd 按照cmd命令对元素一一比较后给出排序结果。

    11)split string splitchar 按照splitchar对string进行分割,返回分割后的list

    12)join list joinstring 将list元素合并到字符串,中间以joinstring分开,缺省joinstring为空格。

    7,控制流

    和c语言类似,支持常见的控制流,if,switch,while,for,foreach。foreach 可以对list进行很好的遍历。

    复制代码
    if {$x>0}{
        do_something;
    }elseif{$x==0} {
    
    ...
    }else{
        do_anotherthing;
    }
        
    复制代码

    使用{}对语句块进行分割以及条件表达式测试,第一行最后的{必须放在上一行,否则TCL会认为if命令已经结束,而将行首的{当做命令从而导致错误。

    'if {$x>0}'if与{间有空格。

    switch options string {pattern body pattern body} //options可以指定匹配方式-exact,-glob(default),-regexp

    复制代码
    switch $x {
    a -
    b {incr t1}
    c {incr t2}
    default {incr t3}
    }
    复制代码

    while test body

    复制代码
    set i [expr [llength $a] -1]
    while { $i>=0}{
    lappend b [lindex $a $i]
    incr i -1
    } 
    复制代码

    for init test reinit body

    for {set i [expr [llength $a] -1]} {$i>=0} {incr i -1} {
    lappend b [lindex $a $i] }

    foreach varnem list body

    set x {}
    foreach {i j} {a b c d e f} {
    lappend x $j $i
    } 

    和C类似,TCL提供了break,continue命令用于跳出循环。
    source命令,TCL提供source命令来调用和执行其他的tcl脚本,source /home/xxx/scripts/scripts1001.tcl

    8,函数定义

    TCL使用过程proc来进行C类似的函数定义,使用proc可以实现一些自定义的命令,其用法和内置命令一样。

    proc add {x y } {expr $x+$y}
    add 1 2 ;# result is 3

    proc内部可以使用global声明一个全局变量,即该变量在proc体外定义,声明global后,可以在proc内部对全局变量进行访问。
    应用upvar,使用upvar实现对一个变量的引用,upvar othervar myvar,一旦实现引用的绑定,对myvar的修改都将对应到othervar上去。 

  • 相关阅读:
    CTFHub题解-技能树-Web-web工具配置-信息泄露【目录遍历、PHPINFO、备份文件下载】【上】
    CTFHub题解-技能树-Web-Web前置技能-HTTP协议【请求方式、302跳转、cookie、基础认证、响应包源代码】
    CTFHub题解-技能树-基础知识
    Bugku-CTF分析篇-weblogic(黑客攻击了Weblogic应用,请分析攻击过程,找出Weblogic的主机名。)
    Bugku-CTF分析篇-日志审计(请从流量当中分析出flag)
    Bugku-CTF分析篇-抓到一只苍蝇(在哪?here!卧槽?!好大一坨苍蝇。)
    Bugku-CTF分析篇-手机热点(有一天皓宝宝没了流量只好手机来共享,顺便又从手机发了点小秘密到电脑,你能找到它吗?)
    Bugku-CTF分析篇-这么多数据包(这么多数据包找找吧,先找到getshell的流)
    binwalk在Windows10和kali_Linux下的安装及使用教程
    Bugku-CTF分析篇-中国菜刀(国产神器)
  • 原文地址:https://www.cnblogs.com/houxiliang/p/8996384.html
Copyright © 2011-2022 走看看