【问题标题】:Writing a bash script that accepts multiple multi-spaced arguments编写一个接受多个多间距参数的 bash 脚本
【发布时间】:2012-05-21 11:40:52
【问题描述】:

来自(优秀的)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 号码和 Pizza 号码)。

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

不匹配!

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

【问题讨论】:

  • 你写$>411 John Perkins Pizza的时候是指$>411 John Pizza吗?否则PerkinsPizza 都应该产生错误。
  • 没错.. 我会编辑。谢谢。

标签: linux shell unix ubuntu


【解决方案1】:

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

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

  2. 1234563扩展正则表达式)标志。

例如:

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

【讨论】:

  • 如果我想要任意数量的参数怎么办?
  • 酷!有趣的是下一节中的评论循环,我只是没有建立联系。非常感谢。
  • “标准 linux 行为”。您可能是指“标准外壳行为”。 Linux 不在乎您使用什么 shell,也不关心该 shell 如何或是否处理参数。
  • 不应该是大写的-E,还是显式调用egrep
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2021-10-16
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多