【问题标题】:Linux: How do I delegate exotic commandline arguments using a script?Linux:如何使用脚本委托外来命令行参数?
【发布时间】:2010-12-28 07:48:44
【问题描述】:

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

#!/bin/sh
someProgam $@

但是当传递奇异的参数(空的、未转义的、带引号的……)时,这会失败。

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

大括号仅用于可视化。

注意:这是一个 Java 程序,它被调用。不过我觉得没关系。

【问题讨论】:

    标签: linux bash command-line scripting arguments


    【解决方案1】:
    #!/bin/sh
    someProgram "$@"
    

    另请参阅bash docs on special parameters

    顺便说一句,"$@" 并非特定于 bash。您可能可以在跨平台 sh 脚本中依赖 "$@" 来在任何地方运行。

    顺便说一句,如果这恰好是该脚本中的最后一行,您可以通过将行更改为类似的内容来为您的操作系统保存几个字节和进程表中的一个条目

    exec someProgram "$@"
    

    【讨论】:

      【解决方案2】:

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

      2.2.3 Double-Quotes

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

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

      2.5.2 特殊参数

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

      @

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

      【讨论】:

      • 感谢您指出 "$@" 适用于(如果不是全部的话)非 bash sh 实现。我在回答中添加了一个小注释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多