2

(优秀的)Unix 编程环境中的一个例子 考虑了一个地址簿:

 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

不匹配!

那么如何告诉 shell 接受带有任意空格的多个参数呢?

4

1 回答 1

3

当您grep使用多个参数调用时,它假定第一个是模式,所有其他都是要搜索的文件。您需要进行两项修改:

  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 回答