我正在尝试创建一个简单的bash脚本,使用exec插件运行带有一些特定参数和“sub”参数的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=\""$@"\"
我还尝试了第二个脚本,我称之为引号:
./myapp \""$@"\"
这也不起作用,经过一段时间的良好组合,感觉无论我引用它多少次,它仍然把它视为一个参数列表,作为第一个元素“-a,然后第二个元素是val1,然后是第三个-b,依此类推。
好奇的是,如果我不在引号脚本中引用参数,并像这样运行它:./quoter "-a val1 -b val2 -c val3"
它工作正常,它作为单个参数传递给第二个脚本,然后传递给执行maven命令的第一个脚本。
看起来,“$ @”并不是一个由所有参数的字符串连接组成的字符串(如果你考虑它就很酷),也不回应它似乎将它转换成一个(不酷)。有没有办法让这成为可能?
PS:是的我正在尝试将选项传递给主程序,这是一个严重依赖的spring独立应用程序。
答案 0 :(得分: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.
答案 1 :(得分:2)
好的,经过几个小时我找到了解决方案,就在这里。我创建了全新的脚本,所以我将从头开始。
创建一个最终用户将执行的简单脚本,并将参数作为普通命令行应用程序传递:
$./myapp -a val1 -b val2 -c val3
将包含以下内容:
mvn exec:java -Dexec.args="$*"
$ *和$ @之间的区别在于$ @会将参数作为列表传递,并且还会对这些值进行一些格式化,例如删除引号等。另一方面,$ *会将所有参数视为单个参数,对它们进行分组并让它们将它们作为字符串值完全传递给内部命令。