TCL TK 教程:工具命令语言

TCL是什么?

TCL 是一个 shell 应用程序,它从其标准输入或文件读取 TCL 命令并给出所需的结果。

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

在本教程中,您将学习-

如何执行 TCL

执行TCL代码有两种方法

  1. Windows 此处提供基于应用程序 tcltutor exe 文件
  2. 基于Linux的应用程序

In Linux 交互式解释器,我们可以执行下面的 TCL 脚本

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

TCL 教程:工具命令语言

TCL 脚本

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

/usr/bin/tclsh 的 #!

例子:-

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

输出: 你好世界

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

放入?-nonewline? ?channelId? 字符串

  • 无换行符:此可选参数默认命令会隐藏换行符。它会在每个字符串后面添加一个换行符
  • 通道ID:该参数用于标准输入通道(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 中创建变量,您需要使用 “放” 命令

设定 10

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

% 放入 $a

%10

因此我们得到变量‘a’的值为10。

TCL命令信息存在

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

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

前任:-

% 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 脚本的命令行参数数量作为全局变量传递 氩气 . Tcl 脚本的名称作为全局变量传递给脚本 精氨酸0 其余的命令行参数以列表形式传递 精液.

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表达和 Opera器

表达式由操作数和运算符构成。它使用“expr”命令进行求值。 Opera运算符的计算基于优先级和结合性。TCL 语言有以下内置运算符

Opera类别 图形符号 优先级/结合性
算术 Opera器 + - * / % 左到右
相关的 Opera器 == != < > <= >= 左到右
合乎逻辑 Opera器 && || ! 左到右
按位 Opera器 & | ^ ~ 左到右
三元 Opera器 ?: 右到左
Shift Opera器 << >> 左到右
字符串比较 Opera器 等式 左到右
幂 Opera器 ** 左到右
列表 Opera器 因尼 左到右

算术 Opera器

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

相关的 Opera器

检查左操作数的值是否大于右操作数的值。如果是,则条件成立并返回 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

合乎逻辑 Opera器

&& 如果两个操作数都非零,则条件为真并返回 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”的值现在已从 1 变为 0。而“b”的值已从 0 变为 1。

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

按位 Opera器

& (按位与)逐位进行运算,按照下表进行操作。

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 一个 | 乙
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 艾比
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

三元 Opera托爾(?:)

语法是

condition-expression?  expression_1: expression_2

如果条件表达式为真,则计算 exp1 并返回结果。如果条件表达式为假,则计算 exp2 并返回其结果。在我们的示例中,由于 A 的值大于 1,因此 exp6 为真。

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

Shift Opera器

Shift 运算符用 << 左移运算符或 >> 右移运算符表示。对于 << 左移运算符,左操作数的值将按右操作数指定的位数向左移动。

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

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

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

字符串比较 Opera器

字符串比较运算符比较两个操作数的值。如果操作数的值相同,则返回 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

列表 Opera器

如果在定义的列表中找到所需值,则返回 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 ... 语句

句法:-

如果 expr ?then? 主体

如果 expr 的计算结果为真,则执行命令主体。

前任:-

set age 10

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

Output: Age is less than 20

If ... else 语句

句法 :-

如果表达式?则 body_1 否则 body_2

如果表达式的计算结果为真,则返回 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,使用相同的代码,我们 switch 语句将 b 的另一个值切换为 200。输出将显示 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  {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 {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 扩展名