Bashスクリプトでヒアドキュメントをファイルに書き込むにはどうすればよいですか?
10 に答える
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
cat
I/O リダイレクトを使用するtee
代わりに、代わりに使用すると便利な場合があります。
tee newfile <<EOF
line 1
line 2
line 3
EOF
sudo
これはより簡潔であり、リダイレクト演算子とは異なり、ルート権限でファイルに書き込む必要がある場合に組み合わせることができます。
@Livvenの回答に基づいて構築するために、ここにいくつかの便利な組み合わせがあります.
変数の置換、先頭のタブの保持、ファイルの上書き、stdout へのエコー
tee /path/to/file <<EOF ${variable} EOF
変数置換なし、先頭のタブ保持、ファイルの上書き、stdout へのエコー
tee /path/to/file <<'EOF' ${variable} EOF
変数の置換、先頭のタブの削除、ファイルの上書き、stdout へのエコー
tee /path/to/file <<-EOF ${variable} EOF
変数の置換、先頭のタブの保持、ファイルへの追加、stdout へのエコー
tee -a /path/to/file <<EOF ${variable} EOF
変数の置換、先頭のタブの保持、ファイルの上書き、stdout へのエコーなし
tee /path/to/file <<EOF >/dev/null ${variable} EOF
上記と組み合わせることもでき
sudo
ますsudo -u USER tee /path/to/file <<EOF ${variable} EOF
この問題が発生する可能性がある将来の人々のために、次の形式が機能しました。
(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
たとえば、次のように使用できます。
最初(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