2013-09-22 7 views
1

Итак, у меня в настоящее время есть скрипт bash, который предполагает, что ему нужно отправить массив команд в консоль. Как видно ниже, я использую IFS для их разделения на новой строке, и затем я помещаю их в переменную cmds_eval с сценарием ожидания. Тогда я надеялся использовать $ cmds_eval, как показано ниже, чтобы сразу отправить кучу команд в сценарий ожидания. Это не работает. Кажется, $ cmds_eval не интерпретируется так, как я думал. Каким будет подходящий способ сделать это? Я не верю, что есть в любом случае, чтобы сделать Еогеасп внутри ожидать сценария, но если есть ... Сценарий ниже упрощена конечно ...Работа с массивами 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="\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':

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

спасибо, работает. Обратите внимание на других людей, которые это делают. Убедитесь, что вы передаете cmds из другого места, вы делаете «$ cmds», иначе пробелы превращают $ cmds в часть вектора arg. –

Смежные вопросы