Expect脚本中for循环如何实现步长为2的递增?
解决方法
错误原因
你之前修改split相关代码的思路是错误的:split命令的作用是将传入的字符串按分隔符拆分为列表,和循环步长完全无关,额外加的+1参数不符合split的语法规范,因此会触发报错。
正确实现
1. 仅调整循环步长为2(仅处理下标为0、2、4...的任务,串行执行)
只需修改for循环的第三段增量逻辑,将默认步长1改为2即可:
# 仅修改这一行即可,原有循环内逻辑保持不变 for { set index 0 } { $index < [llength $tarts] } { incr index 2 } { # 原有循环代码 }
2. 每次循环并行执行2个注册任务(同时处理index和index+1两个任务,提升执行效率)
如果需要同时跑两个任务,避免串行等待的耗时,可参考以下完整修正代码(同时修复了原代码中[lindex $tart $index]的逻辑错误,$tart已经是单个元素无需再次取值):
/usr/bin/expect << 'EOF2' set tarts [split $env(Tarts)] set ips [split $env(IPs)] puts "Tarts to be updated: $tarts" puts "IPs of Tarts: $ips" for { set index 0 } { $index < [llength $tarts] } { incr index 2 } { puts "In Loop: $index, [expr {$index+1}]" # 启动第一个任务进程 set tart1 [lindex $tarts $index] set ip1 [lindex $ips $index] spawn telnet $ip1 6187 set pid1 $spawn_id # 若存在第二个任务则同步启动 set pid2 "" if {$index+1 < [llength $tarts]} { set tart2 [lindex $tarts [expr {$index+1}]] set ip2 [lindex $ips [expr {$index+1}]] spawn telnet $ip2 6187 set pid2 $spawn_id } set timeout -1 # 处理第一个任务交互逻辑 set spawn_id $pid1 expect { "*traffic*" { puts "``````````````````````````````````````````````````````````````" puts "Registering Group1, Group2 of Tart#: $tart1" send "traffic map rate reg_group1 30000\r" send "traffic map rate reg_group2 30000\r" puts "wait 300 seconds .." send "traffic go\r" sleep 300 sleep 2 puts "``````````````````````````````````````````````````````````````" puts "Setting hold_time for 4kagents to 20000s" send "traffic map param 4kagents hold_time=20000\r" send "traffic map param 4kagents hold_time=20000\r" puts "wait 5 seconds .." sleep 5 puts "``````````````````````````````````````````````````````````````" sleep 2 puts "``````````````````````````````````````````````````````````````" puts "Logging in Agents using map 4kagents on Tart#: $tart1" send "traffic map param 4kagents 1\r" puts "wait 120 seconds .." sleep 120 puts "``````````````````````````````````````````````````````````````" } } sleep 3 send -- "^]" expect -exact "^\]\rtelnet> " send -- "close\r" expect eof # 处理第二个任务交互逻辑(如果存在) if {$pid2 ne ""} { set spawn_id $pid2 expect { "*traffic*" { puts "``````````````````````````````````````````````````````````````" puts "Registering Group1, Group2 of Tart#: $tart2" send "traffic map rate reg_group1 30000\r" send "traffic map rate reg_group2 30000\r" puts "wait 300 seconds .." send "traffic go\r" sleep 300 sleep 2 puts "``````````````````````````````````````````````````````````````" puts "Setting hold_time for 4kagents to 20000s" send "traffic map param 4kagents hold_time=20000\r" send "traffic map param 4kagents hold_time=20000\r" puts "wait 5 seconds .." sleep 5 puts "``````````````````````````````````````````````````````````````" sleep 2 puts "``````````````````````````````````````````````````````````````" puts "Logging in Agents using map 4kagents on Tart#: $tart2" send "traffic map param 4kagents 1\r" puts "wait 120 seconds .." sleep 120 puts "``````````````````````````````````````````````````````````````" } } sleep 3 send -- "^]" expect -exact "^\]\rtelnet> " send -- "close\r" expect eof } } EOF2
内容的提问来源于stack exchange,提问作者Asad Javed
相关产品推荐
相关产品推荐

