Команда array set
при таком использовании не заменяет переменные в этих определениях.Например, hostArray(0)
имеет буквенные символы $A_HOST
.Самый простой способ исправить это - использовать команду subst
для последующей обработки значений перед использованием.
for { set index 0 } { $index < $NUM_SYSTEMS_IN_A_SYSTEM } { incr index } {
puts "In loop: $index"
spawn ssh -o StrictHostKeyChecking=no -l \
[subst $userArray($index)] [subst $hostArray($index)]
expect "*?assword:"
send "$sshPasswordArray($index)"
#do some stuff here including executing $LINUX_HARDWARE_COLLECTION_FILE...
}
Кроме того, не забудьте поставить \r
в конце send
пароль (для имитации нажатия клавиши Return ) и не забудьте close
порожденный подпроцесс в конце цикла.(Обычно это не критично для 10 элементов, но существует довольно небольшое количество виртуальных терминалов, которые вы можете открыть сразу, включая все остальные их пользователи на вашем компьютере; рекомендуется держать число открытым сразу же маленькимнасколько это возможно.)
Вы также можете использовать его в точке array set
, но это может не сработать, если у вас есть переменные с пробелами, поэтому я не очень рекомендую это:
array set userArray [subst {
0 $A_USERNAME
1 $A_USERNAME
... ...
}]
Примечание: array set
вообще не поддерживает формат комментариев.Вы сделали записи с ключом #11
в вашем примере ...