在expect脚本中使用bash数组

时间:2013-09-22 03:38:34

标签: bash expect

所以我目前有一个bash脚本使用expect需要将一组命令发送到控制台。从下面可以看出,我使用IFS在换行符上划分这些,然后使用expect脚本将它们放入变量cmds_eval中。我希望然后使用如下所示的$ cmds_eval将一堆命令一次性发送到expect脚本中。这不起作用。似乎$ cmds_eval没有像我想象的那样被解释。这样做的适当方法是什么?我不相信无论如何都要在期望脚本中做foreach但是如果有...下面的脚本当然已经简化了......

  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"

1 个答案:

答案 0 :(得分: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'