Linux:如何使用脚本委派外来命令行参数?

时间:2009-12-19 13:50:51

标签: linux bash command-line scripting arguments

我想编写一个包装器bash脚本,并将所有参数传递给被调用的程序。我非常肯定,这是正确的:

#!/bin/sh
someProgam $@

但是当传递异国情调的论点(空,未转义,引号,......)时,这就失败了。

例如:如果没有包装器脚本,someProgram "1 2" 3会产生参数
[1 2][3]
但是从脚本调用,我得到[1][2][3]

大括号只是用于可视化。

注意:这是一个叫做Java程序的程序。但我认为没关系。

2 个答案:

答案 0 :(得分:5)

#!/bin/sh
someProgram "$@"

另请参阅bash docs on special parameters

BTW1,"$@"并非特定于bash。您可以依赖跨平台"$@"脚本中的sh来在任何地方运行。

BTW2,如果这恰好是该脚本的最后一行,您可以将操作系统保存几个字节,并通过将行更改为

来保存流程表中的条目
exec someProgram "$@"

答案 1 :(得分:4)

增加ndim的答案:"$@"的行为并非特定于bash。它是由单Unix规范规定的:

  

2.2.3 Double-Quotes

     

用双引号(“”)括起字符应保留双引号内所有字符的字面值,但字符美元符号,反引号和反斜杠除外,如下所示:

     

参数'@'在双引号内有特殊含义,在Special Parameters中有描述。

     

2.5.2特殊参数

     

下面列出了特殊参数以及它们应扩展的值。仅列出特殊参数的值;有关扩展单词所涉及的所有阶段的详细摘要,请参阅Word Expansions

     

@

     

从一个开始扩展到位置参数。当扩展发生在双引号内,并且执行字段拆分(参见Field Splitting)时,每个位置参数应作为单独的字段扩展,并规定第一个参数的扩展仍应与开始原始单词的一部分(假设扩展参数嵌入在单词中),并且最后一个参数的扩展仍然应与原始单词的最后部分连接。如果没有位置参数,“@”的扩展将产生零字段,即使“@”是双引号。