我在循环中使用 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 分隔的单词进行拆分。