linux - 在 bash 中将 3 个输出行读入 3 个变量

标签 linux bash

我有一个生成 3 行输出的命令,例如

$ ./mycommand
1
asdf
qwer zxcv

我想将这 3 行分配给 3 个不同的变量($a、$b、$c),这样

$ echo $a
1
$ echo $b
asdf
$ echo $c
qwer zxcv

我熟悉通常用于从包含 3 行集合的输出中一次读取 3 行的 while 循环方法。但考虑到我的命令只会输出 3 行,这似乎不够优雅。

我尝试使用 IFS= 的值和 read -r a b c 的选项的各种组合,将命令输出作为标准输入发送,但我只能得到它将第一行设置为第一个变量。一些例子:

IFS= read -r a b c < <(./mycommand)
IFS=$'\n' read -r a b c < <(./mycommand)
IFS= read -r -d $'\n' < <(./mycommand)

如果我修改我的命令,使 3 行由空格而不是换行符分隔,只要前面的每一行都被正确引用,我就可以成功地使用这个变体:

read -r a b c < <(./mycommand)

虽然这对我当前的项目有用,但它仍然困扰着我,我无法让它以其他方式工作。所以我想知道是否有人可以看到并解释我在最初的 3 行输出尝试中遗漏了什么。

最佳答案

如果要读取三行数据,使用三读:

{ read -r a; read -r b; read -r c; } < <(./mycommand)

read 读取一大块数据,然后将其拆分。你无法让它工作,因为你的 block 总是单行。

关于linux - 在 bash 中将 3 个输出行读入 3 个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33047996/

相关文章:

linux - setsid 不工作,报错

ruby-on-rails - 通过 CLI 的 rails 不工作

linux - 使用 OpenCV 让 BeagleBone 捕获静止帧

linux - Bash:一个 IF 语句返回了意想不到的值,你能找到原因吗?

linux - 在 bash 中连接到 Ubuntu 中的 VPN 连接

python - 从 ":"后面的输出中删除所有内容

c++ - 加载共享库时出错 : libboost_iostreams. so.1.59.0: 无法打开共享对象文件: 没有这样的文件或目录

linux - 识别进程的资源使用情况 : CPU, 内存和 I/O

bash - 如何防止后台命令立即挂起

excel - 通过命令行使用 LibreOffice 将 .xls 转换为 .pdf