首页 > 解决方案 > 逐行读取并将每一行分配给 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' 得到第三行和所有额外的行。这不是一个真正的问题,因为我知道我的程序要输出的确切行数。

我想知道是否有更好的方法来做到这一点。

标签: bashshell

解决方案


这是我的看法。

#!/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"
  • 在你的情况下替换printfmy_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

推荐阅读