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