Bash带引号传递给java命令行应用程序

Bash带引号传递给java命令行应用程序,java,bash,picocli,Java,Bash,Picocli,我有一个使用Picocli编写的java命令行应用程序,我试图向它传递一个字符串参数,但每次尝试bash时,都会去掉引号,并以三个参数结束 javaCLI install "Extras lib v0.1.4.cpkg" 这是我在bash中收到的输出 positional parameter at index 0..* (package_file) should be specified only once Usage: javaCLI install package_file 我尝试使用单

我有一个使用Picocli编写的java命令行应用程序,我试图向它传递一个字符串参数,但每次尝试bash时,都会去掉引号,并以三个参数结束

javaCLI install "Extras lib v0.1.4.cpkg"
这是我在bash中收到的输出

positional parameter at index 0..* (package_file) should be specified only once
Usage: javaCLI install package_file

我尝试使用单引号(\')和双引号(\”),转义空格(\),甚至单引号和双引号(带引号和不带引号)但是它们都不起作用。简单的解决方法是将包重命名为extras_lib_v0.1.4.cpkg,但我在其他方法中也会遇到同样的问题。

我猜
javaCLI
是一个调用
java
的包装脚本,并且引号会被这个包装脚本去掉

错误消息“索引0处的位置参数..*(package_文件)应仅指定一次”告诉我,
安装
子命令有一个名为
package_文件
的带注释的字符串字段,因此它只需要一个位置参数,但被多个参数调用

通过设置系统属性
-Dpicocli.trace=DEBUG
,可以确认java应用程序错误地接收了4个参数,而不是所需的2个参数。这将导致picocli打印一些详细信息,包括它接收的命令行参数

我猜
javaCLI
包装器脚本传递的参数如下:

java -cp myjar.jar:picocli-4.2.0.jar com.xxx.MainClass $@
如果是这种情况,则可以通过确保在将参数传递给
java
可执行文件时保留引号来解决问题。感谢使用来保留引号的想法:

# attempt to ensure each argument keeps its original quoting
ARGS=$( printf "%q " "$@" )

java -cp myjar.jar:picocli-4.2.0.jar com.xxx.MainClass ${ARGS}

如果我的猜测不正确,请在问题中提供更多细节。

什么是“javaCli”?您自己编写的shell脚本?
javaCli安装Extras*.cpkg
(如果您无法击败他们,请加入他们)。您也可以尝试
find.-name“*.cpkg”-exec javaCli install{}\;
您想将双引号传递给java应用程序,还是仅仅使用它们作为分隔符?我打赌问题不在
bash
中,而是在
javaCli
中,因此我加入第一条注释的问题:什么是
javaCli
?如果没有帮助,错误消息是正确和准确的。“用法:javaCli。”“您已经使用了
javaCli
。投票以打字错误结束。@pyserial killer我用一个新的想法更新了我的答案:在调用
java
时使用
printf
保留引号。