我们说我有一个命令my_command
,我确信输出三行如
line 1
line 2
line 3
我希望将这三行存储到三个变量$x
,$y
,$z
中。我怎样才能在bash中实现这个目标?
答案 0 :(得分:4)
for name in x y z; do
read $name
done < <(my_command)
这使用进程替换,以便在子shell中不执行read
命令,并且在循环完成后生成的变量可用。变量name
用于保存要设置的变量的名称; $name
扩展为read
设置的变量的名称,因此在循环之后,您有三个变量x
,y
和z
输出的三行。
您也可以使用here文档而不是进程替换:
for name in x y z; do
read $name
done <<EOF
$(my_command)
EOF
答案 1 :(得分:4)
这是另一个:
IFS=$'\n' read -d '' x y z __ < <(my_command)
使用-d ''
,它将分隔符设置为'\0'
,并使read
在一个实例中读取整个输入,而不只是一行。 IFS=$'\n'
将换行符(\n
)设置为每个值的分隔符。 __
是可选的,除了前3行之外还收集任何额外的输入。
来自help read
:
从标准输入或文件描述符中读取单行 如果提供了-u选项,则为FD。该行被分割为字段 单词分裂,并将第一个单词分配给第一个NAME,即 第二个单词到第二个NAME,依此类推,任何剩余的单词 分配到最后一个NAME。只有在$ IFS中找到的字符才是 被认为是单词分隔符。
-d delim继续,直到读取DELIM的第一个字符,而不是换行符