2

(優れた) Unix Programming Environmentの例で は、アドレス帳を考慮しています。

 John Perkins 616-555-4444
 Bill Jotto 773-222-1112
 Dial-a-Clown 738-224-5823
 Prince Alex 837-999-999
 Pizza Hut 833-339-222
 Pizza Puk 882-922-222
 Pizza Buk 822-221-111

現在、「 411」というアドレス帳を検索するプログラムを書いています。

   grep $* /file/location/411

現在411を実行すると、

 $> 411 John
 >John Perkins 616-555-4444

ここで、ジョンに電話してピザを食べに誘いたいと言います (ジョンの番号とピザの番号を探しています)。

 $>411 John Pizza
 grep: can't open pizza

歯が立たない!

では、シェルに任意のスペースを含む複数の引数を受け入れるように指示するにはどうすればよいでしょうか?

4

1 に答える 1

3

grep複数の引数を指定して呼び出すと、最初の引数がパターンで、他のすべてが検索対象のファイルであると想定されます。次の 2 つの変更を行う必要があります。

  1. プログラムを呼び出すときは、複数単語の引数を二重引用符で囲む必要があります。これは標準的なシェルの動作です。

  2. プログラムは、コマンド ラインから引数を読み取り、それらを に個別に送信するかgrep、複合式 ( ) を作成して(拡張正規表現) フラグarg1|arg2|arg3を付けて に渡す必要があります。grep-E

例えば:

args="$1"
shift   # $2 becomes $1, $3 becomes $2, and so on
while [ -n "$1" ]; do
   args="$args|$1"
   shift
done

grep -E "$args" /path/to/address/book

または:

while [ -n "$1" ]; do
  grep "$1" /path/to/address/book
  shift
done
于 2012-05-13T22:25:15.167 に答える