TCL TK 教程:工具命令语言

什么是TCL?

TCL是一种shell应用程序,它从标准输入或文件中读取TCL命令并给出期望的结果。

TCL是一种基于字符串的脚本语言,也是一种过程式语言。它最初由John Osterhout于1989年创建。开发该语言的目的是为了方便嵌入到应用程序中。该语言常用于GUI和测试。例如,快速原型设计、测试数据库交互等。在TCL中,默认情况下一切都是字符串。

在本教程中,您将学习-

如何执行TCL

有两种执行TCL代码的方法

  1. Windows版应用程序可在tcltutor exe文件下载
  2. Linux版应用程序

Linux交互式解释器中,我们可以按如下方式执行TCL脚本:

要访问TCL交互式会话,请执行以下命令

TCL Tutorial: Tool Command Language

TCL脚本

TCL程序应具有.tcl扩展名。UNIX/LINUX中的每个脚本都以TCL shell路径开头

#!/usr/bin/tclsh

示例:-

#!/usr/bin/tclsh
Puts "Hello World"
Script execution:-
$ chmod +x helloworld.tcl
$ ./helloworld.tcl

输出:Hello World

在TCL中,“puts”命令用于将消息打印到控制台。puts的语法如下

puts?-nonewline? ?channelId? string

  • Nonewline:此可选参数会抑制默认命令的换行符。它会在每个字符串后添加一个换行符。
  • Channelid:此参数用于标准输入通道(stdin)和标准输出通道(stdout)。

示例:-

%puts "Hello World"
% Hello World
%puts stdout  "Hello World"
% Hello World

TCL替换类型

TCL中有三种替换方式:

  1. 命令替换
  2. 变量替换
  3. 反斜杠替换

让我们逐一学习

命令替换

方括号用于命令替换。

示例:-

% puts [expr 1*3]
% 3

在这里,方括号之间的命令首先被求值。结果被返回。“expr”用于执行算术计算。

变量替换

TCL使用$符号进行变量替换。

示例:-

#!/usr/bin/tclsh
set  a  10
puts  a
puts  $a 

这里我们创建一个名为“a”的变量,并为其赋值“10”。

  • puts a:它会将字符串“a”打印到控制台,而不是“a”的值。
  • puts $a:它会将“a”的值打印到控制台。

让我们执行并验证一下。您将获得如下输出。

$ ./substitution.tcl

a

10

反斜杠替换

在Tcl中,反斜杠用于转义特殊字符以及将长命令跨越多行。反斜杠后面的任何字符都将保持不变,不会被替换。在下面的示例中,您可以看到特殊字符“ ”在反斜杠之后保留。

让我们通过一个例子来验证一下

#!/usr/bin/tclsh

puts "This  is my  \"car\"

$ ./backslashsubstitution.tcl
This is my "car"

注意:-在TCL中,使用“#”来注释任何字符串。tclsh shell命令会忽略“#”之后的所有字符。

TCL变量

变量是持有值的标识符。换句话说,变量是内存的引用,值就存储在那里。

变量由“set命令”创建,并且所有变量名都是区分大小写的。这意味着hello、Hello、HELLO在TCL中都不同。看一些关于区分大小写变量的例子。

% set  name  Techoit
% set  Name  Technoit_1
% set  NAME  Technoit_2

输出:-

% puts $name
% Technoit

%puts  $Name
%Technoit_1

%puts $NAME
%Technoit_2

创建TCL变量

要在TCL中创建变量,您需要使用“set”命令

Set a 10

要获取变量的值,必须使用“$”符号,例如:

% put $a

% 10

因此,我们得到变量“a”的值为10。

TCL命令 Info exist

如上所示,“set”命令用于创建和读取变量。unset命令用于销毁变量。“info exists”命令在当前上下文中,如果varName作为变量(或数组元素)存在,则返回1,否则返回0。(请参见下面的示例)。

TCL中有各种“info”命令,如“info exists”、“info functions”、“info global”等。这里我们将看一个“info exists”的例子。

示例:-

% set a 20
% puts $a
% 20
% puts [info exists a]
% 1
% unset a
%puts [info exists a]
% 0

不同的花括号及其行为

{} -> 花括号

TCL中的花括号将单词分组为参数。花括号用于定义一个延迟执行的块——换句话说,它可能在当前行上其余命令的**之后**运行。花括号内的字符会按原样传递给命令。

需要记住的一些要点

  1. 花括号{}内不允许变量替换
  2. 它用于创建列表数据类型

示例:-

% set x 10
% puts {$x}
% $x

%set number {1 2 3 4 5} -> 这里number是一个列表数据类型

%puts $number

%1 2 3 4 5

[] -> 方括号

方括号用于创建嵌套命令。简单来说,一个命令的输出作为另一个命令的参数传递。方括号用于定义一个在当前行上其余命令**之前**运行的块,并将结果替换到行中。

例如:-

% set x 10
% puts "y : [set y [set x 10]]"
%y : 10
% puts "x : $x"
%x : 10

() -> 圆括号

此命令用于创建数组数据类型,并指示运算符优先级。

% set a(1) 10
% set a(2) 20

这里“a”是一个数组,值为10和20。查看下面的命令以打印键、键值对和数组的值。

% puts [array get a] ->  To print key value pairs we use this command
% 1 10 2 20 
% puts [array names a]  -> To print only keys
% 1 2
% puts $a(1)   -> To print first value of array
% 10
% puts $a(2)  -> To print second value of array 
% 20

要打印数组a的“第N个”值,我们将使用Puts $a(N)

TCL命令行参数

从命令行传递到脚本的数据项称为参数。Tcl脚本的命令行参数数量通过全局变量argc传递。Tcl脚本的名称通过全局变量argv0传递给脚本,其余的命令行参数以列表形式传递在argv中。

TCL有3个预定义变量,例如:

$argc   -> indicates the number of arguments passed to the script

$argv   -> indicates list of arguments

$argv0  -> indicates the name of script

例如:-

arg-script.tcl
#!/usr/bin/tclsh<
puts   "number of arguments passed to the scripts : $argc"
puts  "list of arguments are passed to the script: $argv"
puts  "the name of scripts is: $argv0"
$ ./arg-script.tcl  10 20 30

输出:-

  • 传递给脚本的参数数量:3
  • 传递给脚本的参数列表:10 20 30
  • 脚本名称为:arg-script.tcl

TCL表达式和运算符

表达式由操作数和运算符构成。它使用“expr”命令进行求值。运算符根据优先级和关联性进行求值。TCL语言具有以下内置运算符:

运算符类别 符号 优先级/关联性
算术运算符 + - * / % 从左到右
关系运算符 == != < > <= >= 从左到右
逻辑运算符 && || ! 从左到右
位运算符 & | ^ ~ 从左到右
三元运算符 ?: 从右到左
移位运算符 << >> 从左到右
字符串比较运算符 eq ne 从左到右
指数运算符 ** 从左到右
列表运算符 in ni 从左到右

算术运算符

TCL表达式由操作数、运算符和括号的组合构成。让我们看一个TCL中算术运算符的例子。

+ 将两个或多个操作数相加

示例:-

%set a 10 
%set b 20
%puts [expr $a + $b]
30

- 减去两个或多个操作数

示例:-

%set a 20 
%set b 10
%puts [expr $a - $b]
10

* 乘以两个或多个操作数

%set a 20 
%set b 10
%puts [expr $a * $b]
200

/ 将被除数除以除数

%set a 20 
%set b 10
%puts [expr $a / $b]
2

% 模运算符将被除数除以除数,但返回余数

%set a 20 
%set b 10
%puts [expr $a % $b]
0

关系运算符

检查左操作数的值是否大于右操作数的值。如果是,则条件为真并返回1,否则返回0。

%set a 20 
%set b 10
%puts [expr $a > $b]
1

检查左操作数的值是否小于右操作数的值。如果是,则条件为真并返回1,否则返回0。

%set a 10 
%set b 20
%puts [expr $a < $b]
1

>= 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真并返回1,否则返回0。

%set a 20 
%set b 10
%puts [expr $a >= $b]
1

<= 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真并返回1,否则返回0。

%set a 20 
%set b 10
%puts [expr $a <= $b]
0

!= 检查两个操作数的值是否相等,如果不相等,则条件为真并返回1,否则返回0。

%set a 20 
%set b 10
%puts [expr $a != $b]
1

== 检查两个操作数的值是否相等,如果是,则条件为真并返回1,否则返回0。

%set a 20 
%set b 10
%puts [expr $a == $b]
0

逻辑运算符

&& 如果两个操作数都非零,则条件为真并返回1,否则返回0。

%set a 20 
%set b 10
%puts [expr $a && $b]
1

|| 如果两个操作数中任何一个非零,则条件为真并返回1,否则返回0。

%set a 0 
%set b 10
%puts [expr $a || $b]
1

! 用于反转任何表达式的结果。在这里,输出中您可以看到“a”的值已从0变为1。而“b”的值已从1变为0。

%set a 0 
%set b 1
%puts [expr !$a]
1
%puts [expr !$b]
0

位运算符

& (按位与)执行逐位操作,并遵循下表进行操作。

A B A & B
0 0 0
0 1 0
1 1 1
1 0 0

示例:-

%set A 10
%set B 20

Follow the sequence to convert decimal to binary number
128 64 32 16 8 4 2 1
10 binary equivalents will be  
128 64 32 16 8 4 2 1  à  0 0 0 0 1 0 1 0
20 binary equivalents will be 
128 64 32 16 8 4 2 1  à  0 0 0 1 0 1 0 0

So now as per above tabular rules

A & B will be 0 0 0 0 0 0 0 0 

| (按位或)执行逐位操作,并遵循下表。

A B A | B
0 0 0
0 1 1
1 1 1
1 0 1

示例:-

%set A 10
%set B 20

Follow the sequence to convert decimal to binary number
128 64 32 16 8 4 2 1
10 binary equivalents will be  
128 64 32 16 8 4 2 1  à  0 0 0 0 1 0 1 0
20 binary equivalents will be 
128 64 32 16 8 4 2 1  à  0 0 0 1 0 1 0 0

So now as per above tabular rules

A | B will be 0 0 0 1 1 1 1 0 

^ (按位异或)执行逐位操作,并遵循下表。

A B A ^ B
0 0 0
0 1 1
1 1 0
1 0 1

示例:-

%set A 10
%set B 20

Follow the sequence to convert decimal to binary number
128 64 32 16 8 4 2 1
10 binary equivalents will be  
128 64 32 16 8 4 2 1  à  0 0 0 0 1 0 1 0
20 binary equivalents will be 
128 64 32 16 8 4 2 1  à  0 0 0 1 0 1 0 0

So now as per above tabular rules

A ^ B will be 0 0 0 1 1 1 1 0 à 30

~ (按位取反)运算符将每个1更改为0,将0更改为1,请参考表格。

A ~A
0 1
1 0
%set A 7
%puts [expr ~$A]
-8

三元运算符(?:)

语法是

condition-expression?  expression_1: expression_2

如果condition-exp为真,则计算exp1并返回结果。如果cond-exp为假,则计算exp2并返回其结果。在我们的示例中,exp1为真,因为A的值大于6。

%set A 7
%set result [expr $A > 6 ? true : false]
%puts $result
true

移位运算符

移位运算符由左移运算符“<<”或右移运算符“>>”表示。对于<<左移运算符,左操作数的值向左移动由右操作数指定的位数。

%set A 7
%set result [expr $A << 2]
%puts $result

对于>>右移运算符,左操作数的值向右移动由右操作数指定的位数。

%set A 7
%set result [expr $A >> 2]
%puts $result

字符串比较运算符

字符串比较运算符比较两个操作数的值。如果操作数的值相同,则返回1,否则返回0。在示例中,A和B的值都是7,因此结果返回1。

示例:-

%set A 7 
%set B 7
%set result [expr $A eq $B]
%puts $result
1

Ne(如果两个操作数的值不同,则返回1,否则返回0)

%set A 7 
%set B 8
%set result [expr $A ne $B]
%puts $result
1

指数运算符

Pow()和**都相同。它总是返回浮点值。

**表示所需操作数的幂。

示例:-

%set A 7
%set result [expr $A ** 2]
%puts $result
49

列表运算符

如果在定义的列表中找到所需的值,则返回1,否则返回0。在示例中,变量“a”中存在值1,因此返回1。

set a {1 2 3}
if {1 in $a} {
puts "ok"
} else {
puts "fail"
}
Output: ok

ni,如果在定义的列表中找到所需的值,则返回0,否则返回1。

例如:-

set a {1 2 3}
if {1 ni $a} {
puts "ok"
} else {
puts "fail"
}
Output: fail

TCL流程控制和决策制定

有各种流程控制和决策制定命令,用于改变程序的流程。程序执行始终从源文件的顶部到底部开始。

If语句由布尔表达式后跟一个或多个语句组成。

If ... 语句

语法:-

if expr ?then? body

如果expr求值为真,则执行命令的主体。

示例:-

set age 10

if {$age < 20} {
puts "Age is less than 20"
}

Output: Age is less than 20

If ... else 语句

语法:-

If expression ? then body_1 else body_2

如果expression求值为真,则返回body_1,否则返回body_2。

例如:--

set age 10

if {$age < 20} {
puts "Age is less than 20"
} else {
Puts "Age is greater than 20"
}

output: Age is less than 20

嵌套的if..else语句

这意味着一个if或else..if语句可以放在另一个if或else..if语句中。

语法:-

If  {expression_1} {
Body_1
If {expression_2} {
Body_2
}
}

例如:--

set a 10
set b 20

if {$a == 10} {
# if expression_1 is true then it will go to expression_2
if {$b == 20} {
#if expression_2 is true then it will print the below string
puts "value of a is 10 and b is 20"
}
}

o/p: value of a is 10 and b is 20

Switch语句

Switch语句允许测试一个变量是否与值列表相等。它会评估值列表并返回该评估的结果。如果没有匹配的值,则将返回默认值。

示例:

#!/usr/bin/tclsh

# switch_cmd.tcl

set domain x
switch $domain {

    x { puts "x" }
    y { puts "y" }
    z { puts "z" }
    default { puts "unknown" }
}

嵌套switch

嵌套switch语句意味着switch语句内部的switch语句。

语法 :-

switch <switchingstring1> {
   <matchstring1> {
      body1
      switch <switchingstring2> {
        <matchstring2> {
           body2
         }
          ...
    switch <switchingstringN> {
          <matchStringN> {
           bodyN
         }
      }
   }

示例:在以下示例中,a的值为100,并且使用相同的代码,我们对b的值200执行switch语句。输出将显示a和b的值。

#!/usr/bin/tclsh

set a 100
set b 200

switch $a {
   100 {
     puts "The value of a is $a"
     switch $b {
        200 {
           puts "The value of b is $b"
        }
     }
   }   
}

输出:-

a的值为100

b的值为200

TCL循环语句

循环语句允许执行一个语句或一组语句多次。Tcl提供以下类型的循环语句。

While命令

当给定条件为真时,循环体中的语句或语句组会重复执行。

语法:

While  {condition} {
    Statements
}

例如:-

#!/usr/bin/tclsh

Set a 10

While {$a < 12} {
    Puts "a is $a"
    incr a
}

输出:-

a是10

a是11

在上面的示例中,使用了“incr”内置命令。这意味着'a'的值将增加1,直到达到最大值(<12)。

For命令

它根据计数器的值执行一系列语句多次。在循环的每次重复中,它会自动增加或减少。

语法 :-

For {start} {test} {next} {
Body
}

示例:在下面的示例中,'i'的值设置为0,并递增直到值<5。

#!/usr/bin/tclsh

for {set i 0} {$i < 5} {incr i} {
put $i
}

输出:-

0 
1 
2 
3 
4

摘要

  • TCL是一种基于字符串的脚本语言,也是一种过程式语言。
  • 该语言常用于GUI和测试。
  • 在TCL中,默认情况下一切都是字符串。
  • TCL是一种shell应用程序,它从标准输入或文件中读取TCL命令并给出期望的结果。
  • TCL程序应具有.tcl扩展名。