whileループでこのドキュメント変数を使用してください。

whileループでこのドキュメント変数を使用してください。

ループでHere Document変数を使用する際に問題があります。なぜならこれがうまくいくからです。

while IFS= read -r line; do
  echo "(${line})"
done <<EOF
one
two
three
EOF

しかし、これはそうではありません

foo=<<EOF
one
two
three
EOF

while IFS= read -r line; do
  echo "(${line})"
done <<<"$foo"

今私はbashスクリプトが初めてです。頭の上に疑問符があるだけでなく、2番目の構文(ここではスクリプトの上部に記載されている)を維持し、何とか動作させる方法を知りたいです。

ご協力ありがとうございます。

答え1

fooこれにより、変数が区切られた文書の内容に設定されなくなります。

foo=<<EOF
one
two
three
EOF

リダイレクトを使用した空の文字列の変数割り当て。これにより、何が起こっているのかをより明確にすることができます。

foo=""  <<EOF
one
two
three
EOF

しかし、実際にはheredocは必要ありません。ただし:

foo="one
two
three"

答え2

明らかに、インライン文書変数を望み、それを行に分割します。次のことができます。

lines=$(cat <<EOF
one two
three
four
EOF
)

IFS=$'\n'     # split on non-empty lines
set -o noglob # disable globbing as we only want the split part.

# use split+glob (leave ${lines} unquoted):
for line in ${lines}; do
   echo "${line}"
done

オンラインで分割されないようにIFSを設定した方法を確認してください。 spc/tab/newline で区切られた単語はデフォルトで分割されます。

関連情報