• ベストアンサー

grepコマンドについて

以下のシェルプログラムのout_fileの内容が0バイトファイルになって しまいます。理由について教えて下さい。よろしくお願いします。 while read param do grep ${param} in_file > out_file done < "search_file" ここでsearch_fileは -e "bbb" -e "ddd" in_fileは aaa bbb ccc ddd eee です。 因みにsearch_fileを -e bbb -e ddd とすると out_fileは期待通り、 bbb ddd となります。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

他の方が書いてますが、"" 付きで探すのでマッチしません。man sh や man bashを読むと、引用符を外す処理と変数置換処理の順番が書いてあります。変数置換結果の引用符は外れません。 >-e bbb -e ddd とすると out_fileは期待通り、 が正しい対応ですが、それで何がまずいのでしょうか?もし空白などを含むので""で囲んだと言うことなら、grep の -f オプションを使うと良いでしょう。while readも不要になります。 あるいは、eval grep ${param} in_file とすると変数置換後にもう一度構文解析するので、引用符が外れます。

その他の回答 (2)

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.2

shスクリプトは do 文の中で " が取れません。 " を取り除くのは shell の機能ですが do 文の中はもはや shellではない。 ということで。 プログラム的には do 文処理内で system()を使ってもよさそうですが、 そうするとまた/bin/shを呼び出してしまう。 ループだから重くなるのを回避したのかも。 だから上のスクリプトは do /bin/sh -c "grep ${param} in_file" > out_file done < "search_file" こうすればok

  • aid-u
  • ベストアンサー率75% (22/29)
回答No.1

「bbb」または「ddd」を検索しようとしているが、 「"bbb"」または「"ddd"」の検索になっているのだと思います。 下記のコマンドを実行するとシェルスクリプトの動きが分かると思います。  bash -x スクリプト名