ファイルにエコーを適用できますが、シェルスクリプトソースではインデントを使用できますか? [コピー]

ファイルにエコーを適用できますが、シェルスクリプトソースではインデントを使用できますか? [コピー]

複数行の文字列をファイルに反映するネストされたインデントされたステートメントがある場合、元のシェル(私の場合はbash)のインデントがターゲットファイルに送信されます。

これを防ぐために、エコーされた出力からインデントを削除しましたが、ソースコードからインデントされたコード形式は失われます。例:

#! /bin/bash

function configure_default_vhost() {

    case "$2" in
        [--production])
              echo "<VirtualHost *:80>
# These lines are "breaking" out of the preffered indenting
redirect 404 /
ErrorDocument 404
</VirtualHost>
" > /etc/apache/sites-availabe/000-default.conf
    esac
}

私の目標は、できるだけ次のようなものを得ることです。

#! /bin/bash

function configure_default_vhost() {

    case "$2" in
        [--production])
              echo "<VirtualHost *:80>
                    # These lines are aligned with the preffered indenting
                    redirect 404 /
                    ErrorDocument 404
                    </VirtualHost>
                    " > /etc/apache/sites-availabe/000-default.conf
    esac
}

(注:この質問はHEREDOCに関する質問と重複する可能性があると記載されています。この質問に答えるべき正しい場所がどこにあるのかわからないので、ここに入力します(そうでない場合はお知らせください)。コードブロックのインデントに関するものです。heredocはこれを行ういくつかの方法の1つです。実際にheredocは私が望む解決策ではありません。

ベストアンサー1

修飾子と一緒に「here-document」を使用できます-。タブを使用してインデントできます。echoからに切り替える必要がありますcat

cat <<-EOF > /etc/apache/sites-availabe/000-default.conf
        <VirtualHost *:80>
        redirect 404 /
        ErrorDocument 404     
        </VirtualHost>
EOF

あるいは、結果でタブを保持するには、HERE文書を前処理してsed4つのスペースにインデントすることもできます。

sed 's/^    //' <<EOF
....{
....(------)func () {
....(------)return
....(------)}
....}
EOF

スクリプトの書式設定方法を示すために、スペースとタブの.代わりにスペースとタブを使用しました。(------)

おすすめ記事