cat <<EOF
構文は、Bash で複数行のテキストを扱う場合に非常に便利です。シェル変数、ファイル、またはパイプに複数行の文字列を割り当てるとき。
cat <<EOF
の例 Bash での構文の使用法:
1.複数行の文字列をシェル変数に割り当てる
$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)
$sql
変数は改行文字も保持するようになりました。 echo -e "$sql"
で確認できます .
2.複数行の文字列を Bash のファイルに渡す
$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF
print.sh
ファイルには以下が含まれています:
#!/bin/bash
echo $PWD
echo /home/user
3.複数行の文字列を Bash のパイプに渡す
$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF
b.txt
ファイルには bar
が含まれています そして baz
行。同じ出力が stdout
に出力されます .
これはヒアドキュメントと呼ばれます stdin に文字列を提供する形式。詳細については、https://en.wikipedia.org/wiki/Here_document#Unix_shells を参照してください。
man bash
から :
ドキュメントはこちら
このタイプのリダイレクトは、シェルに現在のソースから入力を読み取るように指示します。
その時点までに読み取られたすべての行は、コマンドの標準入力として使用されます。
ヒアドキュメントの形式は次のとおりです:
<<[-]word
here-document
delimiter
word では、パラメータ展開、コマンド置換、算術展開、またはパス名展開は実行されません . 単語に文字がある場合 引用符、区切り文字 word の引用を削除した結果です 、およびヒアドキュメントの行 は展開されません。If 単語 ヒアドキュメントのすべての行は引用されていません パラメータ展開、コマンド置換、および算術展開の対象となります。後者の場合、文字列 \<newline>
無視され、\
文字 \
を引用するために使用する必要があります 、 $
、および `
.
リダイレクト演算子が <<-
の場合 の場合、すべての先頭のタブ文字が入力行と delimiter を含む行から削除されます .これにより、シェル スクリプト内のヒア ドキュメントを自然な方法でインデントできます。
あなたの場合、「EOF」は「ヒアタグ」として知られています。基本的に <<Here
「タグ」 Here
まで複数行の文字列を入力することをシェルに指示します .このタグには好きな名前を付けることができます。多くの場合、EOF
です。 または STOP
.
Here タグに関するいくつかのルール:
<オール>例:
$ cat >> test <<HERE
> Hello world HERE <-- Not by itself on a separate line -> not considered end of string
> This is a test
> HERE <-- Leading space, so not considered end of string
> and a new line
> HERE <-- Now we have the end of the string