Пробелы разрушены эхом >>

10

Я создаю сценарий, который читает содержимое файла, манипулирует содержимым и добавляет его в другой файл (в частности, файл виртуальных хостов). Форматирование и пробелы в выходном файле важны, но когда я пишу содержимое, пробелы удаляются.

VHOST_PATH="/etc/apache2/extra/httpd-vhosts.conf"
TEMPLATE_PATH="./template.conf"
TEMPLATE=$(<TEMPLATE_PATH)
# manipulating $TEMPLATE
echo $TEMPLATE                   #outputs correct whitespace
echo $TEMPLATE >> $VHOST_PATH    #does not output correct whitespace

Итак, первое эхо производит что-то вроде

<VirtualHost *:80>
    ServerAdmin webmaster@domain
    DocumentRoot "root/web"
    ServerName domain
    ErrorLog "root/logs/error_log"
</VirtualHost>

но строка, которая попадает в файл

<VirtualHost *:80> ServerAdmin webmaster@domain DocumentRoot "root/web" ServerName domain ErrorLog "root/logs/error_log" </VirtualHost>

Как сохранить пробелы при добавлении в целевой файл? Я искал это, но все подобные вопросы не относятся к моему сценарию, не переписав его.

Джефф
источник

Ответы:

9

Как и любая другая программа, echo интерпретирует строки, разделенные пробелами, как разные аргументы.

После звонка

echo foo    bar

единственные данные, которые передаются в echo оболочкой, - это первый аргумент, fooа второй - bar.

Чтобы передать всю строку, содержащую пробелы, в качестве одного аргумента, заключите ее в двойные кавычки:

echo "foo    bar"

напечатает все четыре пробела.

Деннис
источник
С другой стороны: я нахожу удивительным, что echo $TEMPLATEэто сработает. Он должен также свернуть несколько пробелов.
Деннис
Да! Вот и все. Это имеет смысл, но я не осознавал, что это так. Кроме того, echo $TEMPLATEработал, потому что у меня были кавычки вокруг этого, но я забыл скопировать его в свой пост. Я не думал, что это важно. Я был неправ!
Джефф
1
@Jeff Смотрите следующее: Команды и аргументы
slhck
1
@ Джефф, при обращении за помощью очень важно вырезать и вставлять вместо повторного набора текста.
Гленн Джекман
@glennjackman Я думал, что смогу избежать повторного набора, так как скрипты были такими короткими, и копирование + вставка были бы проблемой, так как я работал в терминале. я был неправ. урок выучен. Спасибо за совет.
Джефф