4

この問題の解決策があるかどうかを知りたいです。

私のシェルスクリプトには、テキストをファイルにリダイレクトするコードがあります。

if [ condition ]; then
   cat > /outputfile <<EOF
text123
text345
text456
EOF
fi

問題は、コード内で textxxx をインデントする必要があることですが、これを行うと、リダイレクトされたテキストにスペースが含まれてしまいます。

コードをうまくインデントして、出力ファイルにスペースを入れないようにする方法はありますか。

4

2 に答える 2

5

使用する

cat<<-EOF
   text123
EOF
于 2013-11-01T19:34:52.193 に答える
2

標準的な答えは、先頭のタブ (空白ではなくタブである必要があります) と-「単語」の前に使用することです。

cat <<-'EOF'
        Tab-indented text
    Blank-indented text
EOF

(「Tab-indented」の前に 1 つ以上の実際のタブがある場合) は次のように出力されます。

Tab-indented text
    Blank-indented text

それが不便すぎる場合は、sed代わりにcat次を使用することもできます。

sed 's/^[     ]*//' <<EOF
    Randomly
        Indented
  Text
EOF

出力は次のとおりです。

Randomly
Indented
Text

(繰り返しますが、適切な場所にタブがあることを確認する必要があります。ここでは、コマンドの正規表現を意味しsedます。または、必要に応じて使用することもできますsed 's/^[[:space:]]*//'。)

'EOF'vsの使用EOFは、ヒア ドキュメントの本文がどのように解釈されるか (または解釈されないか) に影響することに注意してください。比較:

cat <<-EOF
        $(rm -fr *)  # Do not try this at home! (Or at work.)
        $HOME
EOF

cat <<-'EOF'
        $(rm -fr *)
        $HOME
EOF

1 つ目は、シェルに$(...)表記法を認識させてコマンドを実行し、出力 (何もない) をヒア ドキュメントに置き換えます。ここ 1 年か 2 年にわたってあなたが行ってきた仕事について申し訳ありません。良いバックアップがあることを願っています。2 つ目は、先頭のタブを削除する以外は、スクリプトの内容を逐語的に処理します。これはより安全ですが、次のような表記法$(rm -fr *)はあまり安全ではありません! 変数$HOMEは最初のバージョンで展開されます。2番目は変更されません。

于 2013-11-01T20:06:22.053 に答える