所以我目前有一个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"
答案 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'