我需要一个脚本来修改多个服务器中的相同数据。现在for循环生成命令行,但我遇到了expect和pssh的一些问题。
for循环:
<code>
for ((var1=1;var1<=14; var1++))
{
cda stm add "$var1/$var2/$var3" ss 1
for ((var2=1;var2<=8;var2++))
{
cda stm add "$var1/$var2/$var3" ss 1
for ((var3=1; var3<64; var3++))
{
cda stm add "$var1/$var2/$var3" ss 1
}
}
}
</code>
我在期望剧本中使用pssh代替ssh。
完整代码:
<code>
#!/usr/bin/expect
set timeout 20
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
for ((var1=1;var1<=14; var1++))
{
cda stm add "$var1/$var2/$var3" ss 1
for ((var2=1;var2<=8;var2++))
{
cda stm add "$var1/$var2/$var3" ss 1
for ((var3=1; var3<64; var3++))
{
cda stm add "$var1/$var2/$var3" ss 1
}
}
}
spawn pssh "$user\@$ip"
expect "yes/no" {
send "yes\r"
expect "*?assword" { send "[lindex $argv 2]\r" }
} "*?assword" { send "[lindex $argv 2]\r" }
expect "SH"
interact
</code>
我收到以下错误:
<code>
wrong # args: should be "for start test next command"
while executing
"for ((var1=1"
(file "./ssh" line 9)
</code>
答案 0 :(得分:0)
for
循环和Tcl必须如下所示:
for {set var1 1} {$var1<=14} {incr var1} {
commands...
}
换句话说,for
命令需要 四个参数:起始码,条件,“下一个”代码和循环体。请注意,换行符是Tcl中的命令分隔符,因此循环体的左括号必须与for
命令位于同一行(或者必须使用反斜杠换行符续行)
您使用的是bash / ksh语法。
答案 1 :(得分:0)
除了for循环中的语法错误之外,问题中的代码片段存在逻辑问题:
这可能是你需要的:
for {set var1 1} {$var1 <=14} {incr var1} {
puts "LEVEL_1: $var1"
# cda stm add "$var1" ss 1
for {set var2 1} {$var2 <=8} {incr var2} {
puts "LEVEL_2: $var1/$var2"
# cda stm add "$var1/$var2" ss 1
for {set var3 1} {$var3 <64} {incr var3} {
puts "LEVEL_3: $var1/$var2/$var3"
# cda stm add "$var1/$var2/$var3" ss 1
}
}
}