在 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 脚本来说有点菜鸟。除了我头上有问号之外,我想知道如何保留第二种语法(脚本顶部的此处文档)并仍然使其以某种方式工作。

感谢您的帮助。

答案1

这不会将变量设置foo为定界文档的内容:

foo=<<EOF
one
two
three
EOF

它是对空字符串的变量赋值,并带有重定向。这可能会让发生的事情更清楚:

foo=""  <<EOF
one
two
three
EOF

但你实际上并不需要heredocs。做就是了:

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 分隔的单词进行拆分。

相关内容