将bash参数列表转换为带引号的单个字符串

将bash参数列表转换为带引号的单个字符串,bash,maven,exec-maven-plugin,Bash,Maven,Exec Maven Plugin,我正在尝试使用exec插件创建一个简单的bash脚本来运行带有一些特定参数和“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

我正在尝试使用exec插件创建一个简单的bash脚本来运行带有一些特定参数和“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=\""$@"\"
我还尝试了第二个脚本,我称之为quoter:

./myapp \""$@"\"
这也不起作用,经过一段很好的组合播放时间后,感觉无论我引用了多少次,它仍然将其视为一个参数列表,第一个元素“-a”,第二个元素val1,第三个元素-b,依此类推

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

./quoter "-a val1 -b val2 -c val3"
它工作正常,作为单个参数传递给第二个脚本,然后传递给执行maven命令的第一个脚本

看起来“$@”并不是一个由所有参数串接而成的字符串(如果你想一想,这很酷),也不是一个将其转换为一个的字符串(不酷)。有什么方法可以做到这一点吗


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

ManBash

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.

好的,再过几个小时,我找到了一个解决方案,在这里。我创建了一个全新的脚本,所以我将从头开始

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

$./myapp -a val1 -b val2 -c val3
其中将包含以下内容:

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

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

Ok,再过几个小时我找到了一个解决方案。我创建了一个全新的脚本,所以我将从头开始。创建一个简单的脚本,最终用户将作为普通命令行应用程序执行并传递参数:$./myapp-a val1-b val2-c val3,它将包含以下内容:mvn exec:java-Dexec.args=”$*“我不确定$*和$@之间的差异背后的细节,但这最终起到了作用。再次,看到这个,是的,几分钟前我自己发现了它,但你是对的,我可以用$*来解决它。当stackoverflow允许的时候,我会发布一个关于如何重写所有内容的详细回答,我还没有足够的分数来回答。哇,刚刚看到这个,是的,我没有使用正确的参数展开。我会再多调查一点,如果我发现一些我可以展示的东西,我会在stackoverflow允许的时候回答:)非常感谢!!!!!我只是想说100%清楚。。。“$*”(美元星)与“$@”(美元at)不同,有时很容易错过正在使用的字符。