884

Bashスクリプトでヒアドキュメントをファイルに書き込むにはどうすればよいですか?

4

10 に答える 10

1310

Advanced Bash-Scripting Guide Chapter 19. Here Documentsを読んでください。

内容を次のファイルに書き込む例を次に示します。/tmp/yourfilehere

cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
        This line is indented.
EOF

最後の 'EOF' (The LimitString) は単語の前に空白があってはならないことに注意してください。これは、LimitStringが認識されないことを意味するからです。

シェル スクリプトでは、コードを読みやすくするためにインデントを使用したい場合がありますが、これはヒア ドキュメント内のテキストをインデントするという望ましくない影響を与える可能性があります。この場合、<<-(ダッシュが続く) を使用して先頭のタブを無効にします (これをテストするには、先頭の空白をタブ文字に置き換える必要があることに注意してください。ここでは実際のタブ文字を印刷できないためです。)

#!/usr/bin/env bash

if true ; then
    cat <<- EOF > /tmp/yourfilehere
    The leading tab is ignored.
    EOF
fi

テキスト内の変数を解釈したくない場合は、一重引用符を使用します。

cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF

コマンド パイプラインを介してヒアドキュメントをパイプするには:

cat <<'EOF' |  sed 's/a/b/'
foo
bar
baz
EOF

出力:

foo
bbr
bbz

... または、以下を使用してヒアドキュメントをファイルに書き込みますsudo

cat <<'EOF' |  sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
于 2010-06-02T03:40:50.250 に答える
185

catI/O リダイレクトを使用するtee代わりに、代わりに使用すると便利な場合があります。

tee newfile <<EOF
line 1
line 2
line 3
EOF

sudoこれはより簡潔であり、リダイレクト演算子とは異なり、ルート権限でファイルに書き込む必要がある場合に組み合わせることができます。

于 2013-06-13T17:35:13.950 に答える
58

@Livvenの回答に基づいて構築するために、ここにいくつかの便利な組み合わせがあります.

  1. 変数の置換、先頭のタブの保持、ファイルの上書き、stdout へのエコー

    tee /path/to/file <<EOF
    ${variable}
    EOF
    
  2. 変数置換なし、先頭のタブ保持、ファイルの上書き、stdout へのエコー

    tee /path/to/file <<'EOF'
    ${variable}
    EOF
    
  3. 変数の置換、先頭のタブの削除、ファイルの上書き、stdout へのエコー

    tee /path/to/file <<-EOF
        ${variable}
    EOF
    
  4. 変数の置換、先頭のタブの保持、ファイルへの追加、stdout へのエコー

    tee -a /path/to/file <<EOF
    ${variable}
    EOF
    
  5. 変数の置換、先頭のタブの保持、ファイルの上書き、stdout へのエコーなし

    tee /path/to/file <<EOF >/dev/null
    ${variable}
    EOF
    
  6. 上記と組み合わせることもできsudoます

    sudo -u USER tee /path/to/file <<EOF
    ${variable}
    EOF
    
于 2016-08-02T21:48:11.657 に答える
14

この問題が発生する可能性がある将来の人々のために、次の形式が機能しました。

(cat <<- _EOF_
        LogFile /var/log/clamd.log
        LogTime yes
        DatabaseDirectory /var/lib/clamav
        LocalSocket /tmp/clamd.socket
        TCPAddr 127.0.0.1
        SelfCheck 1020
        ScanPDF yes
        _EOF_
) > /etc/clamd.conf
于 2010-06-01T21:02:53.413 に答える
3

たとえば、次のように使用できます。

最初(ssh接続を作成):

while read pass port user ip files directs; do
    sshpass -p$pass scp -o 'StrictHostKeyChecking no' -P $port $files $user@$ip:$directs
done <<____HERE
    PASS    PORT    USER    IP    FILES    DIRECTS
      .      .       .       .      .         .
      .      .       .       .      .         .
      .      .       .       .      .         .
    PASS    PORT    USER    IP    FILES    DIRECTS
____HERE

2 番目 (コマンドの実行):

while read pass port user ip; do
    sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
    COMMAND 1
    .
    .
    .
    COMMAND n
ENDSSH1
done <<____HERE
    PASS    PORT    USER    IP
      .      .       .       .
      .      .       .       .
      .      .       .       .
    PASS    PORT    USER    IP    
____HERE

3 番目 (コマンドの実行):

Script=$'
#Your commands
'

while read pass port user ip; do
    sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip "$Script"

done <<___HERE
PASS    PORT    USER    IP
  .      .       .       .
  .      .       .       .
  .      .       .       .
PASS    PORT    USER    IP  
___HERE

Forth (変数を使用):

while read pass port user ip fileoutput; do
    sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip fileinput=$fileinput 'bash -s'<<ENDSSH1
    #Your command > $fileinput
    #Your command > $fileinput
ENDSSH1
done <<____HERE
    PASS    PORT    USER    IP      FILE-OUTPUT
      .      .       .       .          .
      .      .       .       .          .
      .      .       .       .          .
    PASS    PORT    USER    IP      FILE-OUTPUT
____HERE
于 2014-02-16T10:17:06.170 に答える