编写一个接受多个多间距参数的bash脚本

时间:2012-05-13 22:17:03

标签: linux shell unix ubuntu

来自(优秀)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

现在说我想给约翰打电话并邀请他去吃披萨 (所以我正在寻找John号码和披萨号码。)

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

不匹配!

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

1 个答案:

答案 0 :(得分:3)

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

  1. 当您调用程序时,您需要将双字参数括在双引号字符中。这是标准的shell行为。

  2. 您的程序需要从命令行读取参数,然后将它们单独发送到grep或构建复合表达式(arg1|arg2|arg3)并将其传递给grep使用-E(扩展正则表达式)标记。

  3. 例如:

    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