TCL TK 教程:工具命令语言
TCL是什么?
TCL 是一个 shell 应用程序,它从其标准输入或文件读取 TCL 命令并给出所需的结果。
TCL 是一种基于字符串的脚本语言,也是一种过程语言。它最初由 John Osterhout 于 1989 年创建。开发这种语言的目的是便于嵌入 inti () 应用程序。该语言通常用于 GUI 和测试。例如,快速原型设计, 测试 数据库交互等。在TCL中默认一切都是字符串。
在本教程中,您将学习-
如何执行 TCL
执行TCL代码有两种方法
- Windows 此处提供基于应用程序 tcltutor exe 文件
- 基于Linux的应用程序
In Linux 交互式解释器,我们可以执行下面的 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有三种替代方式
- 命令替换
- 变量替换
- 反斜杠替换
让我们逐一研究
命令替换
方括号用于命令替换。
例子:-
% 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 中的花括号将单词组合在一起成为参数。花括号用于定义延迟的块 - 换句话说,它可能在当前行的其余命令之后运行。花括号内的字符将按原样传递给命令。
要记住的一些要点
- {} 括号内不允许变量替换
- 它用于创建列表数据类型
例子:-
% 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 扩展名