2016-05-03 8 views
0

Ich habe Pipeline wie folgt aus:Kann man "test" vor "while read" in der Pipeline verwenden?

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

Aber das funktioniert nicht, weil while read keine Argumente aus der Pipeline mehr bec von test $number -eq 3 &&

lesen Wie kann ich das lösen? Ich darf nicht awk oder sed verwenden.

+1

Was sind Sie mit 'test' zu erreichen versuchen? –

Antwort

2

können Sie verwenden ein process substitution:

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

Zum Beispiel:

$ 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

Es scheint mir, wie der klarste Weg, um Ihren Code zu schreiben, wäre eine if zu verwenden:

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

Wenn Sie wirklich && verwenden möchten, dann denke ich, dass Sie c eine Verwendung dieser:

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

... aber ich persönlich denke nicht, dass es so klar ist.

+1

Ich würde eher zustimmen, es sei denn das 'do ...' im Beispiel ändert den Wert von '$ number', in diesem Fall wäre die Bedingung sowieso falsch. –

0

Ich werde seq 20 | paste - - - - als Ihre "Pipeline" verwenden, um einige Zeilen mit 4 Wörtern pro Zeile zu generieren.

Hier ist Ihr Problem:

$ 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 

Die while-Schleife auf stdin zur Eingabe stecken wartet.

Dieses Update nur Gruppen der Test und zusammen Schleife, so kann read die Ausgabe des Pipeline-Zugang:

$ 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 
Verwandte Themen