2013-11-26 50 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} { 
" 

。循環只是被卡住到0並重復。我無法找到任何關於for循環的信息。有沒有人試過?

UPDATE:聲明的變量以外,現在它循環在第0

回答

2

期待無限次的一個擴展Tcl語言。 Tcl語法對空白非常敏感。你是不是提供的參數之間的空格來for命令

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

注意,incr command需要一個變量,而不是一個值。

花一些時間與Tcl man page瞭解Tcl的工作原理 - 這將是非常值得你花時間的。

另外,我注意到您的問題中的錯誤消息,$j消失。你是否從這樣的shell腳本調用期望?

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

如果你是,請注意,你必須在期望甚至開始之前保護expect的變量不被shell替代。如有可能,用單引號括住期望程序。


這樣做:

/usr/bin/expect << 'SSHLOGIN' 

引述定界符終止有效報價的整個定界符。否則,在之前,shell會將所有$variables替換爲shell變量,以此來處理程序。

某些Tcl命令採用變量名稱不是一個值。 j是一個變量名稱。 $j是一個值。 setincr是兩個這樣的命令。你必須寫

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

我已經用一種方式更新了一個問題,我如何使用expect。空間沒有幫助。但網頁真的很有幫助我正在嘗試其他幾種如何做到這一點,我會讓你知道。 – sauletasmiestas

+0

這有點令人沮喪。我從'expect -c'得到了相同的結果..「'我嘗試過foreach,而且仍然沒有正確的結果... – sauletasmiestas

+0

感謝它完成了這項工作......但後來我想從Shell腳本中添加一些變量有點棘手。一些命令使用名稱的想法幫助我欺騙了循環。而不是像'SSHLOGIN'那樣從$變量中關閉expect部分。我只是寫了一個這樣的循環:'for {set j 0} {[incr j 0] <5} {incr j}'。 'incr'使用一個名字並返回相同的值,而不需要外部的Shell腳本來查找變量。 – sauletasmiestas