LINUX.ORG.RU

[баян] Shell переменная с переводами строки

 


0

1

Знаю, что тема старая, и даже поиск выдаёт много полезного, но что-то как-то не помог мне ни один вариант. Ситуация такая - есть скрипт которым прописываются настройки на линупс маршрутизаторе(вроде бы что-то типа zebos), выглядит примерно так:

#!/bin/bash

zebos_shell < EOF
command1
command2
...
commandN
EOF
т.е. команды вводятся в шелл отличный от баша.
Задача в том чтобы, передать в этот список команд команды сформированные в баше. Это легко сделать для одной команды:

#!/bin/bash
my_command="somecommand"
zebos_shell < EOF
command1
command2
${my_command}
...
commandN
EOF

но не получается запихать в my_command несколько команд (с переводом строки). Вариант

my_command="somecommand1\nsomecommand2\nsomecommand3" 
и манипуляции с IFS (пробовал $'\x10')успеха не принесли. Вариант типа eval/echo -e ${my_command} тоже не подходит, так как echo будет выполняться во «внутреннем» шелле.
Почему приходится пихать всё в одну переменную: во внешнем файле будет список маршрутов и их оптимальное добавление, я, кроме как конкатенацией в цикле придумать не смог

★★★★★

Ответ на: комментарий от drull

это же лишь подобие шелла...оно принимает только по одной команде на строку, и никаких конвейеров

zolden ★★★★★
() автор топика

Вариант типа eval/echo -e ${my_command} тоже не подходит, так как echo будет выполняться во «внутреннем» шелле.

Не вижу проблемы.

[~/tmp] % cat test.sh   
#!/bin/bash

my_command="somecommand1\nsomecommand2\nsomecommand3" 
cat > zebos_shell << EOF
command1
command2
`echo -e ${my_command}`
...
commandN
EOF
[~/tmp] % ./test.sh     
[~/tmp] % cat zebos_shell 
command1
command2
somecommand1
somecommand2
somecommand3
...
commandN
[~/tmp] %
AX ★★★★★
()
Ответ на: комментарий от AX

Знаете, есть такое чувство когда хочется сказать «Чёрт, я так и знал!».
Так вот - у меня его нет.
Большое спасибо, без вас не допёр, хотя действительно всё лежало на поверхности.

ЗЫ
backticks - зло, остановился на варианте $(echo -e ${my_command})

zolden ★★★★★
() автор топика
Ответ на: комментарий от botkin

>Можно еще проще :)

тупее - не значит проще

Led ★★★☆☆
()
Ответ на: комментарий от botkin

Покажете как это сделать в цикле, получите пирожок.
На основе файла вида
1
2
3
4
Надо получить переменную вида
input 1 param x
input 2 param x
input 3 param x
input 4 param x

zolden ★★★★★
() автор топика
Ответ на: комментарий от zolden

Ну в таком случае, конечно, лучше вышеразобранным способом, но и такой вариант возможен:

$ echo -e "1\n2\n3\n4\n5" | ( while read i ; do A="${A}input $i param x
> " ; done ; echo -n "$A" )
input 1 param x
input 2 param x
input 3 param x
input 4 param x
input 5 param x
$ 

(вторая строка начинается с «>» — это bash ждет завершения команды после открывающей кавычки. В скрипте просто перевод строки на этом месте будет, разумеется.)

botkin
()
Ответ на: комментарий от botkin

отлично, отлично.
Теперь остался последний апгрейд - чтобы работало для файла вида
1
2
3
4
5
...
n

zolden ★★★★★
() автор топика
Ответ на: комментарий от botkin

а. понел теперь о чём речь.
Я изначально по сути это и сделал

for line in $(cat FILE);do my_command="${my_command}\ninput ${line} param x";done

zolden ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.