Введите строки в начале и конце файла в bash с переменными

Я создаю скрипт, который возьмет файл csv и создаст файл XML. Сценарий также будет принимать введенные пользователем данные для передачи в xml. Я создал скрипт, который создаст мой XML, но у меня проблемы с вводом переменной для чтения в начале файла.

В конечном итоге будет введена более длинная строка с 3 переменными в строке - я просто пишу основы в минуту.

Моя проблема в том, что я не могу прочитать переменную $BUS в команде ed. Я читал, что это возможно, но я не смог заставить это работать.

я попробовал свой EOF с одинарной кавычкой и без нее.

 echo "Enter BUS name"
        read BUS

echo $BUS

awk -f xmlbody $FILE  > result.xml
file=result.xml

ed -s $file <<'EOF'
0a
<?xml version="1.0" encoding="utf-8"?>
$BUS
<Data>
.
$a
</Data>
.
w
EOF

exit 0

person Red_badger    schedule 17.01.2020    source источник
comment
Не нужно эхо-запрос, чтение может это сделать read -p "Enter BUS name " BUS   -  person Ivan    schedule 17.01.2020
comment
Не цитируйте разделитель heredoc (EOF). Пример   -  person Aaron    schedule 17.01.2020
comment
Возможно, также стоит заменить ed на sed и использовать канал вместо временного файла.   -  person tripleee    schedule 17.01.2020


Ответы (1)


Из руководства bash:

Если какие-либо символы в [разделителе] заключены в кавычки, [...] строки в здесь-документе не расширяются

Вы должны избегать цитирования вашего разделителя heredoc (здесь EOF). Следующее должно работать:

ed -s $file <<EOF
0a
<?xml version="1.0" encoding="utf-8"?>
$BUS
<Data>
.
\$a
</Data>
.
w
EOF
person Aaron    schedule 17.01.2020
comment
Привет всем, спасибо за оперативные ответы. я уже пробовал с разделителем heredoc без кавычек. это ответ. Я запустил скрипт с set -x, первая строка файла result.xml печатается. + ed -s result.xml ‹Window windowStart=2020-01-15T05:13:28 windowDuration=524288› ? + выход 0 - person Red_badger; 17.01.2020
comment
Кроме того, если убрать кавычки, потеряю ли я возможность добавлять в конец файла, как это обозначено $a? - person Red_badger; 17.01.2020
comment
@Red_badger извините, я не подумал, что $a была инструкцией ed, поэтому вам действительно нужно экранировать $, чтобы она не расширялась до значения переменной $a. Я отредактировал свой ответ в этом отношении - person Aaron; 17.01.2020
comment
Что касается вашей продолжающейся проблемы: ваши журналы set -x показывают, что переменная $BUS расширяется до пустой строки, что могло бы произойти, если бы переменная была неопределенной при ее расширении. Учитывая код, который вы опубликовали, я не вижу причин, по которым это могло бы произойти (может быть, экзотические символы в именах ваших переменных, из-за которых они выглядели бы похожими, но на самом деле были бы разными именами переменных?). Вы опубликовали точный код, который используете? Проблема обычно возникает, если определение переменной выполняется внутри подоболочки, оно не будет распространяться на вызывающую оболочку. - person Aaron; 17.01.2020
comment
Привет всем, спасибо за помощь. Я потратил некоторое время, пытаясь заставить это работать с Эдом, но не смог. Поэтому вместо этого я использовал SED, вероятно, не очень элегантное решение, поскольку для него требуется 3 строки, но, поскольку файл не очень большой, он служит моей цели. Еще раз спасибо - person Red_badger; 17.01.2020