3

我正在尝试使用 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 独立应用程序。

4

2 回答 2

2

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.
于 2014-01-03T22:20:40.513 回答
2

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

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

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

其中将包含以下内容:

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

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

于 2014-01-07T19:10:52.743 回答