在管道中“读取”之前是否可以使用“test”?

时间:2016-05-03 11:03:42

标签: bash while-loop pipeline

我有这样的管道:

pipeline | test $number -eq 3 && while read A B C D; do...; done 

但这不起作用,因为while read无法再从管道中读取参数,因为test $number -eq 3 &&

我该如何解决?我不会使用awk或sed。

3 个答案:

答案 0 :(得分:2)

您可以使用process substitution

test $number -eq 3 && while read A B C D;
do
    ...
done < <(pipeline)

例如:

$ n=3
$ test $n -eq 3 && while read A B C; do echo "A: $A, B: $B, rest: $C --"; done < <(echo a b c d e f)
A: a, B: b, rest: c d e f --

答案 1 :(得分:1)

在我看来,编写代码最清晰的方法是使用if

if test $number -eq 3; then
    pipeline | while read A B C D; do...; done
fi

如果你真的想使用&&,那么我想你可以使用它:

test $number -eq 3 && pipeline | while read A B C D; do...; done

......但我个人并不认为它很清楚。

答案 2 :(得分:0)

我会使用seq 20 | paste - - - -作为您的“管道”来生成一些每行4个单词的行。

这是你的问题:

$ seq 20 | paste - - - - | test $number -eq 3 && while read A B C D; do echo "A=$A B=$B C=$C D=$D"; done
^C

while循环卡在等待stdin上的输入。

此修复只是将测试和循环组合在一起,因此read可以访问管道的输出:

$ seq 20 | paste - - - - | { test $number -eq 3 && while read A B C D; do echo "A=$A B=$B C=$C D=$D"; done; }
A=1 B=2 C=3 D=4
A=5 B=6 C=7 D=8
A=9 B=10 C=11 D=12
A=13 B=14 C=15 D=16
A=17 B=18 C=19 D=20