将文件的每一行读入变量

将文件的每一行读入变量
$ IFS= read a b c << 'EOF'
> line 1
> line 2
> line 3
> EOF

$ printf '<%s> <%s> <%s>\n' "$a" "$b" "$c"
<line 1> <> <>

我希望将每一行读入变量中。所以它会<line 1> <line 2> <line 3>在示例中打印。并保持 POSIX。

我尝试过在文件中添加反斜杠并弄乱 IFS。

答案1

您正在阅读三行,这意味着调用read三次:

{
    IFS= read -r a
    IFS= read -r b
    IFS= read -r c
} <<'END_INPUT'
line 1
line 2
line 3
END_INPUT

printf '<%s> <%s> <%s>\n' "$a" "$b" "$c"

将其推广到任意数量的行:

set --
while IFS= read -r line; do
   set -- "$@" "<$line>"   # cheating here by adding on the "<...>"
done <<'END_INPUT'
line 1
line 2
line 3
line 4
END_INPUT

printf '%s\n' "$*"

"$*"将扩展为一个单引号字符串,其中包含由第一个字符$IFS(默认为空格)分隔的所有位置参数。

相关内容