我有来自ns2的TCL文件a.tcl,如下所示:
set opt(x) 1000
set opt(y) 1000
set opt(z) 15
set opt(per_11ac) 1
set opt(nch) 4
set opt(cbr_rate_DL) 0.05Mb
set opt(cbr_rate_UL) 10Mb
我想从bash脚本自动更改opt(cbr_rate_DL)值,因此对于下一个模拟,我可以更改为0.1Mb,0.5Mb和10Mb,并使用新值重新运行模拟。如何在bash脚本中执行此操作?
答案 0 :(得分:1)
您可以使用for循环结构来执行此操作
for val in 0.1 0.5 10
do
sed -i "/set opt(cbr_rate_DL)/ s/[0-9.]\+/$val/" a.tcl
// run the simulation here
done
上面的sed脚本修改了a.tcl文件inplace(-i
)。
它首先搜索/set opt(cbr_rate_DL)/
的每一行。如果行包含set opt(cbr_rate_DL),如果是,则用点s/[0-9.]\+/$val/
替换数字序列,其值为$val
答案 1 :(得分:1)
执行此操作的最佳方法可能是使用环境变量传递值。在Tcl脚本中,环境变量被映射到全局env
数组,因此您将代码更改为包含use(为了清晰起见,使用额外的空格和注释):
# Set up a default, for safety
set opt(cbr_rate_DL) 0.05Mb
# Has the environment variable been set?
if {[info exists env(CBR_RATE_DL)]} {
# It has! Copy to where it belongs
set opt(cbr_rate_DL) $env(CBR_RATE_DL)
}
然后,只需将CBR_RATE_DL
环境变量设置为您想要的任何值,即可在其中运行其他值。 (当然,如果你正在使用一个由bourne-shell派生的环境,请记住从你的shell export
。)