2

次のようなシェルスクリプトを使用して、grepの結果を調べることは可能ですか?

while read line ; do
    ...
done < grep ...

なぜこれが機能しないのか誰かが説明できますか?選択肢は何ですか?

ありがとう!

4

2 に答える 2

5

プロセス置換を使用しようとしていたようです:

lines=5
while read line ; do
    let ++lines
    echo "$lines $line" # Number each line
    # Other operations on $line and $lines
done < <(grep ...)
echo "Total: $lines lines"

実際grepにいくつかの出力行が返された場合、結果は次のようになります。

6: foo
7: bar
Total: 7 lines

これは とは少し異なりgrep ... | while ...ます: 前者ではサブシェルgrepで実行され、後者ではループはサブシェルで実行されます。これは通常、ループ内から何らかの状態を維持したい場合にのみ関連します。その場合、最初の形式を使用する必要があります。while

一方、あなたが書くならば

lines=5
grep ... | while read line ; do
    let ++lines
    echo "$lines $line" # Number each line
    # Other operations on $line and $lines
done
echo "Total: $lines lines"

結果は次のようになります。

6: foo
7: bar
Total: 5 lines

痛い!カウンターはサブシェル (パイプの 2 番目の部分) に渡されますが、親シェルには返されません。

于 2012-04-16T11:10:39.620 に答える
3

grepはコマンドですが、grep という名前のファイルdone < grepを入力として使用するようにシェルに指示しています。次のようなものが必要です:

grep ... | while read line ; do
    ...
done 
于 2012-04-16T10:08:39.183 に答える