使用命令
if
elseif
else
switch
while
continue
break
for
source
if命令
if命令规定每一个左花括号必须与它前一个字符同行(换行符视为命令分隔符)。
else和elseif只是if命令的可选子句,使用时,要将其与if第二个参数的右花括号放在同一行,不能另起一行。
set n 0
=> 0
if ($n == 0) {
set str zero
} elseif ($n == 1) {
set str one
} elseif ($n == 2) {
set str two
} else {
set str hello
}
=> zero
switch命令
switch命令需要两个参数:第一个参数是待检测的值,第二个参数是包含一个或多个元素对的列表。第一个元素是匹配模式,第二个元素是匹配成功后需要执行的脚本。
建议将匹配模式与对应脚本放在花括号中,可以组织不必要的变量置换,也能避免换行符被当做命令分隔符来处理。
set x ONE
=> ONE
set y 1
=> 1
set z ONE
=> ONE
switch -exact -- $x {
$z {
set v [expr {$z + 1}]
puts "MATCH \$z. $y+$z is $v"
}
ONE {
set v [expr {$z + 1}]
puts "MATCH ONE. $y+one is $v"
}
default {
puts "$x is NOT A MATCH"
}
}
=> MATCH ONE. 1+one is 2
使用switch命令时,可通过短划线“-”将相同脚本的不同匹配模式捆绑在一起,使得代码更简洁。
swich添加注释时,应始终将注释放在匹配模式对应的脚本中。
while命令
while是一种循环,后跟两个参数。第一个参数是一个由表达式构成的循环条件,第二个参数是由Tcl脚本构成的循环体。
while命令终止时,返回一个空字符串。
while命令后的两个参数一定要放在花括号中,以避免while执行前发生意外置换。
continue和break都可以退出循环,并且都是从所在位置直接退出,使得位于同一循环体中其后位置的脚本不被执行。两者区别在于continue只结束本次循环,并不终止整个循环的执行;break则结束整个循环执行。
set n 1
=> 1
while "$n < 3" {
incr n
if {$n > 4} break
if {$n > 3} continue
puts "n is $n"
}
=> n is 2
=> n is 3
puts "Exited loop with n equal to $n"
=> Exited loop with n equal to 5
for循环
for循环后跟4个参数:第一个参数是初始化变量;第二个参数是包含循环变量的表达式,用于判断循环是否执行;第三个参数是更新循环变量;第四个参数是由Tcl脚本构成的循环体。
for循环是可以嵌套的。
set n 4
=> 4
for {set i 0} {$i < $n} {incr i} {
puts "i is $i"
}
=> i is 0
=> i is 1
=> i is 2
=> i is 3
source命令
source命令用于读取一个Tcl文件,并将文件内容作为Tcl脚本运行。
source后的文件名可以用绝对路径指定,也可以用相对路径指定。
# start.tcl
set a 1
# end.tcl
if {$a < 1} {
puts "a is less than 1"
} else {
puts "a is greater than 1"
}
#prog.tcl
source start.tcl
source end.tcl
=> a is greater than 1