我想编写一个包装器bash脚本,并将所有参数传递给被调用的程序。我非常肯定,这是正确的:
#!/bin/sh
someProgam $@
但是当传递异国情调的论点(空,未转义,引号,......)时,这就失败了。
例如:如果没有包装器脚本,someProgram "1 2" 3
会产生参数
[1 2]
和[3]
。
但是从脚本调用,我得到[1]
,[2]
,[3]
。
大括号只是用于可视化。
注意:这是一个叫做Java程序的程序。但我认为没关系。
答案 0 :(得分:5)
#!/bin/sh
someProgram "$@"
另请参阅bash docs on special parameters。
BTW1,"$@"
并非特定于bash。您可以依赖跨平台"$@"
脚本中的sh
来在任何地方运行。
BTW2,如果这恰好是该脚本的最后一行,您可以将操作系统保存几个字节,并通过将行更改为
来保存流程表中的条目exec someProgram "$@"
答案 1 :(得分:4)
增加ndim的答案:"$@"
的行为并非特定于bash。它是由单Unix规范规定的:
用双引号(“”)括起字符应保留双引号内所有字符的字面值,但字符美元符号,反引号和反斜杠除外,如下所示:
参数'@'在双引号内有特殊含义,在Special Parameters中有描述。
2.5.2特殊参数
下面列出了特殊参数以及它们应扩展的值。仅列出特殊参数的值;有关扩展单词所涉及的所有阶段的详细摘要,请参阅Word Expansions。
@
从一个开始扩展到位置参数。当扩展发生在双引号内,并且执行字段拆分(参见Field Splitting)时,每个位置参数应作为单独的字段扩展,并规定第一个参数的扩展仍应与开始原始单词的一部分(假设扩展参数嵌入在单词中),并且最后一个参数的扩展仍然应与原始单词的最后部分连接。如果没有位置参数,“@”的扩展将产生零字段,即使“@”是双引号。