1

所以我目前有一个使用期望的 bash 脚本,它需要将一组命令发送到控制台。如下所示,我使用 IFS 在换行符上划分这些,然后将它们放入带有期望脚本的变量 cmds_eval 中。然后我希望使用如下所示的 $cmds_eval 将一堆命令一次性发送到期望脚本中。这行不通。似乎 $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"
4

1 回答 1

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'
于 2013-09-22T04:11:16.923 回答