Я бы переписал ваш код, чтобы удалить цикл while
:
set number_ok 0
set node_patt "(Reloading configuration on node (\\d+?) \\((\[^)]+?)\\))\r\n(.+?)\r\n"
send "cluster config -r -a\r"
expect {
ERROR {cluster_exit 1}
-re $node_patt {
set line "<$cmdline> $expect_out(1,string)"
set node_num $expect_out(2,string)
set node_name $expect_out(3,string)
set result $expect_out(4,string)
switch -regexp $result {
"Node .+ not found" {
ok 0 "$line (not found)"
}
"Node .+ not responding, skipped" {
ok 0 "$line (not responding)"
}
OK {
ok 1 $line
incr number_ok
}
}
exp_continue ;# loop back to top of expect block
}
$ROOT_PROMPT ;# no action, so fall out of the expect block
}
Обратите внимание, что регулярные выражения Tcl либо полностью жадные, либо не жадные.Я использую \r\n(.+)\r\n
для захвата строки, следующей за «Перезагружать конфигурацию на узле ...».Однако часть .+
не должна содержать переводы строки, поэтому она не должна быть жадной.Таким образом, каждый квантификатор в node_patt
должен быть не жадным.