switch条件,熟悉其它语言程序的switch命令的话就可以忽视此文了。
命令请参考: http://blog.csdn.net/dulixin/archive/2008/03/28/2226874.aspx
switch条件,格式为:
switch ?options? string {pattern body ?pattern body ...?}
其中的花括号可以不要,但是在写脚本的时候建议都用花括号,可以避免很多问题。其中options选项为匹配的风格,string为匹配的字符串,pattern为匹配条件,如果能够匹配就执行body里面的命令,不匹配则不执行。如果最后一个default子句时,没有匹配到就执行default子句中的body,default子句职能有一个且必须是最后一个pattren。如果不是最后一个pattern使用了default,那么解释器就认为只是匹配字符串default。
options中有一个"--"选项,在写脚本的时候最好在string前面都有这个选项,这种习惯会让脚本更加健全。因为这个选项表示了options的结束,而且在string以字符"-"开头时十分有用。
使用严格匹配风格匹配,默认方式:
% set var test
test
% switch -exact -- $var {
example {puts "The string is example"}
test {puts "The string is test"}
}
The string is test
上面的例子可以不带"-exact"选项,因为这个模式就是默认的模式,var的值可以是任意字符串,如果不是pattern选项中的一个,那么就不会输出任何信息,如果想在没有匹配成功的时候也能够输出一些信息那么就需要使用default:
% set var testDefault
testDefault
% switch -- $var {
example {puts "The string is example"}
test {puts "The string is test"}
default {puts "default is running"}
}
default is running
使用通配风格匹配字符串:
% set var test
test
% switch -glob -- $var {
tes? {puts "The glob string is tes?"}
test {puts "The glob string is test"}
}
The glob string is tes?
上面的例子两个条件都能够符合,但是switch命令当有一个pattern符合时,执行完body后就会返回,不会继续往下匹配。
使用正则表达式风格进行匹配:
% set var test
test
% switch -regexp -- $var {
tse? {puts "The regexp string is tes?"}
test* {puts "The regexp string is test*"}
}
The regexp string is test*
使用-nocase进行忽略大小写的匹配,可以和以上三种匹配方式一起使用。
% set var Test
Test
% switch -regexp -- $var {
tse? {puts "The regexp string is tes?"}
test* {puts "The regexp string is test*"}
}
% switch -regexp -nocase -- $var {
tse? {puts "The regexp string is tes?"}
test* {puts "The regexp string is test*"}
}
The regexp string is test*
第一个例子没有匹配上一个选项,第二个例子忽略大小写就可以匹配上。
还有两个必须和正则表达式风格一起使用的选项:-matchvar和-indexvar。-matchvar返回一个列表,列表的内容为匹配的字符串和子字符串,-indexvar一个列表,第一个元素为一个子列表,子列表中的元素为匹配的字符串在string中开始的索引和结束的索引之后的一个索引。后面的元素一次为子模式的开始的索引和结束的索引之后的一个索引。下例为-matchvar:
% set var hahatesthaha
hahatesthaha
% switch -regexp -matchvar varname -nocase -- $var {
tse? {puts "The regexp string is tes?"}
test* {puts "The regexp string is test*"}
}
The regexp string is test*
% puts [lindex $varname 0]
test
表明匹配的字符串为test。以下以-indexvar举例:
% set var hahatesthaha
hahatesthaha
% switch -regexp -indexvar varname -nocase -- $var {
tse? {puts "The regexp string is tes?"}
test* {puts "The regexp string is test*"}
}
% puts [lindex [lindex $varname 0] 0]
4
% puts [lindex [lindex $varname 0] 1]
8
表明匹配的字符串test*在原字符串hahatesthaha中的索引开始为4,不匹配的索引开始为8。