在脚本中调用Linux 命令可以极大提高脚本效率,常用的两个cshell 命令是grep和sed。
- grep用于查找文本中匹配的内容,其中几个开关会经常用到:
-c 输出匹配的数量;
-r 递归查找;
-w 全词匹配;
-m [num] 匹配数量达到num后停止匹配;
在tclsh中可以用exec 调用。
set pattern ‘mypattern’
例如:set aaa [exec grep -w “$pattern” file.txt]
重点来了,当file.txt中没有pattern时,也就是匹配失败时,这本来很正常,但脚本会报错退出,脚本也就无法执行下去;
此时可以用catch先忽略这个错误,让脚本往下执行:
set aaa [catch {exec grep -w “$pattern” file.txt}]
需要注意的是,在这个命令内,各种转义需要再加两个反斜杠\才能正确转义:例如空格\s*
set aaa [catch {exec grep -w “\\\s*$pattern” file.txt}]
另外,还可以将grep 命令设置成一个变量,然后再用exec执行:
set cmd “grep -w “\\\s*$pattern” file.txt”
set aaa [catch {$cmd}] - namespace与upvar
upvar可以使proc中的变量在上一层使用,例如proc里面定义了一个数组,我们想要在外面使用这个数组,这时候return是不管用的,必须要用到upvar,结合namespace使用。
namespace eval parser {
namespace export parser_drv
proc parser_drv {view} {
upvar 1 var var_ori
set var_ori($view,max_tran) 1
}
}
其中upvar 1 var var_ori表示var_ori在上一层用var表示即可。
直接调用$var(ssg,max_tran)即可。
3. format
format与puts结合使用,用在需要格式化输出的场景:
puts $fid [format “my name is %s, my score is %5.3f” $name $score]
其中%5.3f代表输出是保留3位小数点的浮点数,并右移5个空格。
4. string repeat {string} num
用在需要动态调整字符个数的场景。例如,用puts输出时在a和b之间插入5个空格:
puts “a[string repeat { } 5]b”
或者给某个变量的值插入若干个字符:
set result “a[string repeat { } 20]b”
以上两个例子中,这个命令作用不大,可直接敲入所需字符。
重要的是在定义proc时,可以直接通过控制num来实现动态调整:
proc hello {num} {
set result “[string repeat { } $num] -----hello!”
return $result
}
即可通过控制num来调整空格的数量。
5. array数组
tclsh的数组的索引不限定于数字,可以时任意字符(类似于哈希/字典),需要注意的是,在创建array的时候最好先unset一下,
即array unset arrvar *,否则使用的时候会有一些莫名其妙的现象。
array names arrvar 会输出数组索引/元素,$arrvar($elem) 即元素/索引对应的值;