Bash:从两个变量中逐行读取

时间:2015-08-17 12:32:50

标签: bash unix

我试图从两个bash变量中逐行读取。 假设我们有:

   A= 1
      2
      3
      4
   B= 5
      6
      7
      8

所需的输出是:

1 versus 5
2 versus 6
3 versus 7
4 versus 8

我写了以下几行:

while read a && read -u 3 b; do
echo "$a versus $b"
done <"$A" 3< `echo "$B"`

但它不起作用。我想问题是重定向B的值。我也尝试过:

done <"$A" 3<<< `echo "$B"`
done <"$A" 3< "$B"
done <"$A" 3< (cat "$B")

但它仍然不起作用。

3 个答案:

答案 0 :(得分:3)

正如您猜测的那样,您输入的重定向错误。我的第一个试验是使用基于文件的方法,并使用&lt;(...)将变量替换为文件,然后重定向。

while read a && read -u 3 b
do
  echo "$a versus $b"
done < <(echo "$A") 3< <(echo "$B")

然后我修改为使用&lt;&lt;&lt;像这样的运营商

while read a && read -u 3 b
do
  echo "$a versus $b"
done <<<"$A" 3<<<"$B"
1 versus 5
2 versus 6
3 versus 7
4 versus 8

答案 1 :(得分:2)

要从两个变量中读取,您需要进行流程替换。

while read a && read -u 3 b; do
    echo "$a versus $b"
done < <( printf "%s\n" "$A") 3< <(printf "%s\n" "$B")

每个printf的输出看起来像bash的文件,因此可以使用所有常规输入重定向。

答案 2 :(得分:1)

使用粘贴黑客

A=1$'\n'2$'\n'3$'\n'4
B=5$'\n'6$'\n'7$'\n'8

paste -d " versus " <(echo "$A") /dev/null{,,,,,,} <(echo "$B")

1 versus 5
2 versus 6
3 versus 7
4 versus 8