Создание выходного файла с многострочным скриптом без каких-либо изменений с использованием bash/linux

Система CentOS 7.2, ищу решение для создания выходного файла из многострочного кода без изменений. Обратите внимание, что echo "" с двойными кавычками тоже не работает.

небольшая часть образует код:

echo '
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i '46s#.*#cfg_file=/usr/local/nagios/etc/hosts.cfg#' /usr/local/nagios/etc/nagios.cfg &&
sed -i '47s#.*#cfg_file=/usr/local/nagios/etc/services.cfg#' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'48 a \n' /usr/local/nagios/etc/nagios.cfg 
' >> output

Желаемый результат

yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i '46s#.*#cfg_file=/usr/local/nagios/etc/hosts.cfg#' /usr/local/nagios/etc/nagios.cfg &&
sed -i '47s#.*#cfg_file=/usr/local/nagios/etc/services.cfg#' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'48 a \n' /usr/local/nagios/etc/nagios.cfg 

Что я получаю, если использую эхо:

yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
sed -i $45 a n /usr/local/nagios/etc/nagios.cfg &&
sed -i $45 a n /usr/local/nagios/etc/nagios.cfg &&
sed -i $45 a n /usr/local/nagios/etc/nagios.cfg &&
sed -i 46s#.*#cfg_file=/usr/local/nagios/etc/hosts.cfg# /usr/local/nagios/etc/nagios.cfg &&
sed -i 47s#.*#cfg_file=/usr/local/nagios/etc/services.cfg# /usr/local/nagios/etc/nagios.cfg &&
sed -i $48 a n /usr/local/nagios/etc/nagios.cfg &&

Цитаты исчезают

Что я получаю, если использую EOF

yellow=^[[33m
bel=^G
red=^[[31m
green=^[[32m
reset=^[(B^[[m
echo"#${green}Installing packages${reset}#" &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i '46s#.*#cfg_file=/usr/local/nagios/etc/hosts.cfg#' /usr/local/nagios/etc/nagios.cfg &&
sed -i '47s#.*#cfg_file=/usr/local/nagios/etc/services.cfg#' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'48 a \n' /usr/local/nagios/etc/nagios.cfg &&

Как видите, ни один из них не работает как универсальное решение, и я думаю, что их объединение - неправильный способ сделать это...


person Zaza    schedule 21.11.2016    source источник
comment
Используйте EOF в кавычках, как описано в man bash, или замените одинарные кавычки на '\'' в первом фрагменте.   -  person choroba    schedule 21.11.2016
comment
точно такая же домашняя работа, как stackoverflow.com/questions/40711252/   -  person Ipor Sircer    schedule 21.11.2016
comment
if I use EOF - вы говорите об использовании документа здесь. Текст EOF в качестве разделителя произвольный. Говорить if I use EOF было бы бессмысленно без контекста вашего предыдущего вопроса. . Кстати, почему вы используете 2 разных имени для входа?   -  person Ed Morton    schedule 21.11.2016
comment
Вы имели в виду непревзойденную обратную галочку в строке, начинающейся с reset=?   -  person Mr. Llama    schedule 21.11.2016


Ответы (1)


Вы никоим образом не можете заключать одинарную кавычку внутри строки в одинарных кавычках. Здесь проще всего заменить echo на cat и здесь-документ.

cat <<'EOF' >> output
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'45 a \n' /usr/local/nagios/etc/nagios.cfg &&
sed -i '46s#.*#cfg_file=/usr/local/nagios/etc/hosts.cfg#' /usr/local/nagios/etc/nagios.cfg &&
sed -i '47s#.*#cfg_file=/usr/local/nagios/etc/services.cfg#' /usr/local/nagios/etc/nagios.cfg &&
sed -i $'48 a \n' /usr/local/nagios/etc/nagios.cfg 
EOF

Разделитель в кавычках приводит к тому, что содержимое обрабатывается как если бы это была строка в кавычках, не беспокоясь о синтаксисе строк в кавычках.

В противном случае вам нужно будет использовать строку $'...' и обязательно избегать любых заключенных в нее одинарных кавычек и обратной косой черты.

echo $'
...
sed -i $\'45 a \\n\' ...
...
'

Фу.

person chepner    schedule 21.11.2016