.
.
名称
switch - 根据表达式的不同执行多个分支命令中的一个
语法
switch ?options? string pattern body ?pattern body ...?
switch ?options? string {pattern body ?pattern body ...?}
描述
switch命令将string变元与每个pattern变元按顺序匹配,当找到一个匹配的pattern时就执行对应pattern中的body变元,如果最后的pattern变元为default就匹配任何字符串。如果没有匹配到并且default没有给出,switch命令就返回一个空字符串。
如果变元以-开头就是可选项,支持的可选项如下:
-
-exact
- 严格匹配 string和 pattern,默认。 -glob
- 使用通配风格进行模式匹配。 -regexp
- 使用正则表达式进行模式匹配。 -nocase
- 忽略大小写进行匹配。 -matchvar varName
- 只有同时指定了 -regexp的时候才有效果,这个可选项指定了一个变量的名字,这个变量为一个列表。当正则表达式匹配后,这个列表的第一个元素被设置为匹配的字符串,第二个元素为匹配的子模式字符串,以此类推。如果匹配了 default,这个变量就被置为空字符串,这个可选项可以同时指定 -indexvar。 -indexvar varName
- 只有同时指定了 -regexp的时候才有效果,这个可选项指定了一个变量名,这个变量为一个列表,当正则表达式匹配后,这个列表的第一个元素被设置成为两个元素的列表,指明了匹配字符串的开始的索引和不匹配后的第一个字符索引(比如匹配了0-3索引的字符,那么这个值就是4,也就是第一个不匹配的字符),与 regexp中的 -indices类似。与第一个列表元素类似,列表的第二个元素为匹配的子模式字符串开始的索引和不匹配后的第一个字符索引,以此类推。如果匹配了 default,这个变量就被置为空字符串,这个可选项可以同时指定 -matchvar。 --
- 表示可选项结束。
pattern和body变元有两种语法,第一种在每个模式和命令中使用一个独立的变元,这种格式在替换发生在一些模式和命令当中是方便的,第二种格式将所有的模式和命令都放到一个单独的变元中,这个变元必须是一个合法的列表结构,第二种格式使使用多行的switch命令非常方便,因为使用了花括号,所以不用再每行后面使用反斜杠,因为在花括号中,所以命令和变量的替换都不会发生,所以在很多情况下非常有用。
如果body是"-",就意味着下一个模式的body可以在这个模式中使用,这个特性在很多模式中使用相同的body。
在switch中进行注释要小心点,注释必须放在body中,不能放在pattern前面。
示例
switch命令可以匹配变量(结果为2):
set foo "abc"
switch abc a - b {expr {1}} $foo {expr {2}} default {expr {3}}
使用通配风格匹配body(结果为1):
switch -glob aaab {
a*b -
b {expr {1}}
a* {expr {2}}
default {expr {3}}
}
当没有匹配到时,default子句运行(必须是最后一个),示例返回结果3:
switch xyz {
a -
b {
# Correct Comment Placement
expr {1}
}
c {
expr {2}
}
default {
expr {3}
}
}
当使用正则表达式匹配时,使用-matchvar可选项可以很容易的获取详细的匹配内容:
switch -regexp -matchvar foo -- $bar {
a(b*)c {
puts "Found [string length [lindex $foo 1]] 'b's"
}
d(e*)f(g*)h {
puts "Found [string length [lindex $foo 1]] 'e's and/
[string length [lindex $foo 2]] 'g's"
}
}