2013-11-26 3 views
1

Я не могу понять, как работает цикл.Ожидать, что цикл не работает

У меня есть код:

j=0 
/usr/bin/expect << SSHLOGIN 
.......... 
    for {set $j 0} {$j < 5} {incr $j 1} { 
     expect { 
     "*> " { 
     send "$j\r" 
     sleep 1 
      } 
      } 
     } 
........... 
SSHLOGIN 

И он получает сообщение об ошибке, как:

extra characters after close-brace 
    while executing 
"for {set j 0}{ < 5}{incr 1} { 
" 

Если я объявляю J снаружи. Петля просто застревает до 0 и повторяет. Я не могу найти информацию о том, что внутри цикла ожидает ожидание. Кто-нибудь пробовал это?

UPDATE: объявленная переменная снаружи, теперь петли бесконечное число раз на 0.

ответ

2

Ожидать является расширением языка Tcl. Синтаксис Tcl очень чувствителен к пробелу. Вы не обеспечивают пробелы между аргументами команды for

for {set j 0} {$j < 5} {incr j} { 
#............^........^ 

Обратите внимание, что incr command ожидает переменная имя, а не значение.

Проведите некоторое время с помощью Tcl man page, чтобы узнать, как работает Tcl - это будет стоить вашего времени.

Также, я заметил из сообщения об ошибке, что $j исчез. Вы вызываете ожидание от сценария оболочки, как это?

expect -c " ... your expect program here ..." 

Если вы, помните, что вы должны защитить ожидать от переменных-х замещено оболочкой, прежде чем ожидать даже начинается. Если возможно, окружите программу ожидания одинарными кавычками.


ли это:

/usr/bin/expect << 'SSHLOGIN' 

Цитируя Heredoc терминатор эффективно цитирует весь Heredoc. В противном случае оболочка будет заменять все $variables как переменные оболочки до, передавая ожидаемую программу.

Некоторые команды Tcl принимают переменную имя не значение. j - это имя переменной. $j - значение. set и incr - две такие команды. Вы должны написать

for {set j 0} {$j < 5} {incr j 1} { 
# .......^....................^ 
#  no $    no $ 
+0

Я обновил вопрос способом, которым я пользуюсь. Пространства не помогли. Но веб-страница действительно полезна. Я пробую несколько других способов, как это сделать, я дам вам знать. – sauletasmiestas

+0

Это немного разочаровывает. Я получаю те же результаты от «expect -c» .. »« Я пробовал foreach, пока и до сих пор нет подходящих результатов ... – sauletasmiestas

+0

Спасибо, что выполнила эту работу ... Но тогда я хочу добавить некоторые переменные из сценария оболочки немного сложно. Идея, что некоторые команды используют имя, помогла мне обмануть цикл. Вместо закрытия ожидать часть из $ переменных, таких как «SSHLOGIN». Я просто написал такой цикл: 'for {set j 0} {[incr j 0] <5} {incr j}'. 'incr' использует имя и возвращает одно и то же значение, не выходя за пределы сценария Shell, чтобы искать varaible. – sauletasmiestas

Смежные вопросы