【问题标题】:Convert a list of bash arguments to a quoted single string将 bash 参数列表转换为带引号的单个字符串
【发布时间】:2014-01-21 17:04:45
【问题描述】:

我正在尝试使用 exec 插件创建一个简单的 bash 脚本来运行带有一些特定参数和“子”参数的 mvn 命令。看起来很简单,但我无法达到预期的效果:

这是要运行的命令:

mvn exec:java -Dexec.args="-a val1 -b val2 -c val3"

这样运行时效果很好,但我想将它包装在一个 bash 脚本中,方便所有人运行:

myapp -a val1 -b val2 -c val3

脚本很简单:

mvn exec:java -Dexec.args="$@"

但是 "$@" 并没有使它成为一个单引号值,所以我尝试引用它:

mvn exec:java -Dexec.args=\""$@"\"

我还尝试了第二个脚本,我称之为quoter:

./myapp \""$@"\"

这也不管用,在玩了一段时间后,感觉无论我引用多少次,它仍然将其视为参数列表,作为第一个元素“-a,然后第二个元素 val1,然后是第三个 -b,依此类推。

奇怪的是,如果我不引用引用脚本中的参数,并像这样运行它:

./quoter "-a val1 -b val2 -c val3"

它工作正常,它作为单个参数传递给第二个脚本,然后传递给执行 maven 命令的第一个脚本。

看起来,“$@”并不是一个由所有参数的字符串化连接组成的字符串(如果你考虑一下,这很酷),也不是回显它似乎将它转换为一个(不酷)。有没有办法让这成为可能?

PS:是的,我正在尝试将选项传递给主程序,这是一个严重依赖 spring 独立应用程序。

【问题讨论】:

  • 好的,又过了几个小时,我找到了解决方案,就是这样。我创建了全新的脚本,所以我将从头开始。创建一个最终用户将执行的简单脚本并将参数作为普通命令行应用程序传递: $./myapp -a val1 -b val2 -c val3 将包含以下内容: mvn exec:java -Dexec.args= "$*" 不确定 $* 和 $@ 之间差异背后的细节,但这终于奏效了。
  • 再次,刚刚看到这个,是的,我在几分钟前自己找到了它,但你是对的,当我使用 $* 时我可以解决它。当stackoverflow也允许我时,我将发布一个关于如何重写所有内容的详细信息,我还没有足够的分数来回答。

标签: bash maven exec-maven-plugin


【解决方案1】:

man bash...

Special Parameters
  The shell treats several parameters specially. These parameters may only be
  referenced; assignment to them is not allowed.
  *  Expands to the positional parameters, starting from one.  When the expansion
     occurs within double quotes, it expands to a single word with the value of
     each parameter separated by the first character of the IFS special variable.
     That is, "$*" is equivalent to "$1c$2c...", where c is the first character
     of the  value  of  the  IFS variable.  If IFS is unset, the parameters are
     separated by spaces.  If IFS is null, the parameters are joined without
     intervening separators.

【讨论】:

  • 哇,刚刚看到这个,是的,我没有使用正确的参数扩展。我会进行更多调查,如果我找到可以展示的东西,我会在 stackoverflow 允许我时回答:) 非常感谢!!!!!!
  • 只是为了 100% 清楚...“$*”(美元星号)与“$@”(美元 at)不同有时很容易错过正在使用的字符。
【解决方案2】:

好的,又过了几个小时,我找到了解决方案,就是这样。我创建了全新的脚本,所以我将从头开始。

创建一个最终用户将执行的简单脚本,并将参数作为普通命令行应用程序传递:

$./myapp -a val1 -b val2 -c val3

其中将包含以下内容:

mvn exec:java -Dexec.args="$*"

$* 和 $@ 之间的区别在于 $@ 会将参数作为列表传递,并且还会对这些值进行一些格式化,例如删除引号等。另一方面,$* 会将所有参数视为一个单独的参数,将它们分组并让您将它们作为字符串值一起传递给内部命令。

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 2012-10-25
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    相关资源
    最近更新 更多