次のようなシェルスクリプトを使用して、grepの結果を調べることは可能ですか?
while read line ; do
...
done < grep ...
なぜこれが機能しないのか誰かが説明できますか?選択肢は何ですか?
ありがとう!
プロセス置換を使用しようとしていたようです:
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 番目の部分) に渡されますが、親シェルには返されません。
grep
はコマンドですが、grep という名前のファイルdone < grep
を入力として使用するようにシェルに指示しています。次のようなものが必要です:
grep ... | while read line ; do
...
done