Biała spacja jest zwinięta za pomocą echa >>

10

Tworzę skrypt, który odczytuje zawartość pliku, manipuluje zawartością i dołącza do innego pliku (konkretnie pliku hostów wirtualnych). Formatowanie i białe znaki w pliku wyjściowym są ważne, ale kiedy piszę zawartość, białe znaki są usuwane.

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

Pierwsze echo wytwarza coś takiego

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

ale ciąg znaków, który dostaje się do pliku, to

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

Jak zachować białe znaki podczas dołączania do pliku docelowego? Szukałem tego, ale wszystkie podobne pytania nie dotyczą mojego skryptu bez przepisywania go.

Jeff
źródło

Odpowiedzi:

9

Jak każdy inny program, echo interpretuje ciągi znaków oddzielone spacjami jako różne argumenty.

Po telefonowaniu

echo foo    bar

jedynymi danymi, które są przekazywane do echa przez powłokę, jest to, że pierwszy argument jest, fooa drugi jest bar.

Aby przekazać cały ciąg zawierający białe spacje jako pojedynczy argument, umieść go w podwójnych cudzysłowach:

echo "foo    bar"

wydrukuje wszystkie cztery spacje.

Dennis
źródło
Na marginesie: dziwi mnie, że echo $TEMPLATEto zadziała. Powinien także zwinąć wiele białych znaków.
Dennis
Tak! To było to. To ma sens, ale nie zdawałem sobie sprawy, że tak było. echo $TEMPLATEDziałał również, ponieważ miałem wokół niego cytaty, ale zaniedbałem kopiowanie go na mój post. Nie sądziłem, że to ważne. Myliłem się!
Jeff
1
@Jeff Zobacz: Komendy i argumenty
slhck
1
@Jeff, niezwykle ważne jest, aby szukać pomocy wycinać i wklejać zamiast pisać na maszynie.
glenn jackman
@glennjackman Myślałem, że mogę uciec od przepisywania, ponieważ skrypty były tak krótkie, a kopiowanie i wklejanie byłoby uciążliwe, ponieważ pracowałem w terminalu. myliłem się. wyciągnięta lekcja. dzięki za wskazówkę.
Jeff