
テキストファイルでこれを行うと
grep FINAL *.msg
それは戻ってくる
FINAL COMPUTATIONS: Elapsed Time: 000:30:55.65; CPU Time: 000:30:26.53
FINAL COMPUTATIONS: Elapsed Time: 000:28:11.77; CPU Time: 000:27:41.36
今 for ループを実行すると
for line in `grep FINAL *.msg`
"$line"
"FINAL COMPUTATIONS: Elapsed Time: 000:30:55.65; CPU Time: 000:30:26.53"
1行として扱わないでください。
この問題をどのように解決できますか?
答え1
DopeGhotiの言葉は絶対に正しいです。ここでより適切な内容があります。プロセス置換を使用してgrep出力から1行ずつ読み込みます(パターンは現在のディレクトリのすべての* .msgファイルに適用されます)。
i=0;
while read -r line; do
echo $((i++)) "$line";
done < <(grep "FINAL" ./*.msg)
Shellcheck警告なしのコードスニペット :)
答え2
これは、シェルが入力を分割する方法に関連しています。特に明記しない限り、スペースは通常入力を分割することを覚えておいてください。
$ echo "Foo bar baz"
Foo bar baz
$ for word in $(echo "Foo bar baz"); do echo $word; done
Foo
bar
baz