空白はエコーで折りたたまれます>>


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

シェルによってエコーに渡される唯一のデータは、最初の引数がfooで、2番目がbarです。

空白を含む文字列全体を単一の引数として渡すには、二重引用符で囲みます。

echo "foo    bar"

4つのスペースすべてを印刷します。


余談ですecho $TEMPLATEが、それがうまくいくのは驚くべきことです。複数の空白も折りたたむ必要があります。
デニス

はい!それだけでした。それは完全に理にかなっていますが、これが事実であることを知りませんでした。また、echo $TEMPLATE周りに引用があったので機能していましたが、自分の投稿にコピーすることを怠っていました。それが重要だとは思いませんでした。私は間違っていた!
Jeff

1
@Jeff次を参照してください:コマンドと引数
slhck

1
@ジェフ、再入力の代わりにカットアンドペーストすることは、支援を求めるときに非常に重要です。
グレン

@glennjackmanスクリプトが非常に短く、端末で作業していたのでcopy + pasteが面倒なので、再入力を回避できると思いました。私は間違っていた。学んだ教訓。先端をありがとう。
Jeff
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.