GNU/Linux >> Linux の 問題 >  >> Linux

cat << EOFはbashでどのように機能しますか?

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 タグに関するいくつかのルール:

<オール>
  • タグには大文字または小文字の任意の文字列を使用できますが、ほとんどの人は慣例により大文字を使用します。
  • その行に他の単語がある場合、タグは 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
    

    Linux
    1. Awkの「!a [$ 0] ++」はどのように機能しますか?

    2. 文字列にBashの部分文字列が含まれているかどうかを確認する方法

    3. 「bash -c」は何をしますか?

    1. Linux でデバッガーはどのように機能しますか?

    2. ps コマンドはどのように機能しますか?

    3. ループバック インターフェイスはどのように機能しますか

    1. スティッキービットはどのように機能しますか?

    2. .bashrcの目的とそれはどのように機能しますか?

    3. <( cmd ) パターンは bash でどのように機能しますか?