bash - 逐行读取并将每一行分配给 Bash 中的不同变量
问题描述
我有一个输出多行的程序。我想将每一行分配给不同的变量。我试图将输出通过管道传输到一个块:
my_program | {
read -r foo
read -r bar
read -r baz
}
似乎我只能访问块内的这些变量,但我不想将所有内容都放在块内。
我还尝试将 -d 选项与一个不太可能出现在输出中的字符一起使用,因为它是参数。
IFS=$'\n' read -r -d$'\a' foo bar baz < <(my_program)
它似乎工作,除了如果有超过 3 行,变量 'baz' 得到第三行和所有额外的行。这不是一个真正的问题,因为我知道我的程序要输出的确切行数。
我想知道是否有更好的方法来做到这一点。
解决方案
这是我的看法。
#!/usr/bin/env bash
i=0
n=3
while (( i < n )); do
read -r first
read -r second
read -r third
(( i++ )) || break
done < <(printf '%s\n' one two three four five six)
printf '%s\n' "$first" "$second" "$third"
- 在你的情况下替换
printf
为my_program
- 还可以考虑使用类似于评论中所建议的数组
@ogus ismail
。
使用mapfile
又名readarray
mapfile -t -n 3 array < <(printf '%s\n' one two three four five six)
整体array
printf '%s\n' "${array[@]}"
输出
one
two
three
索引从零开始
printf '%s\n' "${array[0]}" "${array[1]}" "${array[2]}"
输出
one
two
three
推荐阅读
- angular - 如何在角度 7 中的 DatePipe 'short' 中设置您自己的 stringFormat?
- java - 无法从我在 BIRT 的报告中引用 Java 类
- javascript - 如何从圆的最外圆弧画线
- php - Wordpress + Woocommerce + 终极会员。使用最终会员注册表单数据更新客户字段
- typescript - Mocha - 对装饰器的实验性支持是一项可能在未来版本中更改的功能
- outlook - Office 加载项在仍在安装时从功能区中消失
- assembly - 为什么在这种情况下 rax 和 rdi 的工作方式相同?
- typescript - Vue: can't use render props with TSX
- javascript - Bash 脚本没有将 Javascript 命令保留到 EOF
- java - Scala - 模式匹配布尔值和默认值时无法访问的代码