2013-09-22 48 views
1

所以我現在有一個bash腳本,使用期望需要發送命令數組到控制檯。從下面可以看出,我使用IFS將這些分割到換行符上,然後使用expect腳本將它們放入一個變量cmds_eval中。然後我希望使用如下所示的$ cmds_eval將一堆命令一次發送到期望腳本中。這不起作用。看起來$ cmds_eval並不像我想的那樣被解釋。什麼是適當的方式來做到這一點?我不相信這是無論如何做的expect腳本里面的foreach,但如果有...下面的腳本已被簡化,當然...在期望腳本中使用bash數組

cmds_eval=""                 

    OLDIFS=$IFS                 
    IFS="\n" read -ra CMDS <<< "$cmds"            
    for c in "${CMDS[@]}"; do              
    cmds_eval+="send -- \"$c\\r\"\r\n"           
    cmds_eval+="expect \"*myprompt*\"\n"         
    done                   
    IFS=$OLDIFS                 

    expect <<- DONE                
    spawn my ssh session              
    expect "*foobar:*"               
    send -- "foobar\r"               
    expect "*foobar:*"               

    $cmds_eval                 

    send -- "foobar\r" 
DONE 

CMDS看起來是這樣的:

cmds="pwd 
mv myfile .. 
ls" 
+0

您可以顯示腳本的早期部分和$ cmds的值嗎? – konsolebox

+1

我已經添加了一個cmds樣子的例子...它實際上經歷了很多,但是這應該足夠好... –

+0

我希望你能檢查我的帖子謝謝。 – konsolebox

回答

2

我覺得你的IFS本身不設置爲一個真正的換行符:

IFS="\n" read -ra CMDS <<< "$cmds" 

應該

IFS=$'\n' read -ra CMDS <<< "$cmds" 

而且也許更喜歡readarray如果可能的話:

readarray -t CMDS <<< "$cmds" 
for c in "${CMDS[@]}"; do 
    cmds_eval+="send -- \"$c\\r\"\r\n" 
    cmds_eval+="expect \"*myprompt*\"\n" 
done 

而不是

OLDIFS=$IFS 
IFS="\n" read -ra CMDS <<< "$cmds" 
for c in "${CMDS[@]}"; do 
    cmds_eval+="send -- \"$c\\r\"\r\n" 
    cmds_eval+="expect \"*myprompt*\"\n" 
done 
IFS=$OLDIFS 

此外,如果你要分開用換行你行,不要使用 「\ n」。請使用$'\ n':

cmds_eval+="send -- \"$c\\r\"$'\n' 
    cmds_eval+="expect \"*myprompt*\"$'\n' 
+0

謝謝,工作。請注意其他人這樣做。確保你是否從其他地方通過cmds「$ cmds」,否則空格將$ cmds作爲arg向量的一部分。 –