ループで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 で区切られた単語はデフォルトで分割されます。