我试图从两个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")
但它仍然不起作用。
答案 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