【问题标题】:Passing a space separated value via shell is taking more argument then expected通过 shell 传递空格分隔值需要比预期更多的参数
【发布时间】:2017-11-03 14:40:11
【问题描述】:

我无法从使用嵌套变量的 shell 脚本 (bash) 启动 java 程序

export MAIN_CLASS="xxxxx"
MAIN_CLASS_ARGS=("$FirstArg" "$SEC_ARG" )
CMD="java some args here ${MAIN_CLASS} ${MAIN_CLASS_ARGS[@]}"
exec $CMD

我将参数传递为

export FirstArg = hello
export SEC_ARG ="hi Jam"

但是在我的主要 java 类中,我得到了 3 个参数 hello, hi ,Jam。但我希望它只有两个。我在这里缺少的任何人都可以帮助我。

我已经检查了一些链接为

link

但无法修复它。

【问题讨论】:

  • 代替CMD="java some args here ${MAIN_CLASS} ${MAIN_CLASS_ARGS[@]}",试试CMD="java some args here ${MAIN_CLASS} \"${MAIN_CLASS_ARGS[@]}\""
  • @AshishSingh 不,这不能解决问题
  • @Ashish 那些转义的引号不是语法,即它们不保护内容不被分词。

标签: java shell command-line jvm-arguments


【解决方案1】:

当您运行exec $CMD 时,会对$CMD 的内容进行分词。变量是如何构建的并不重要。此时,它只是一个被shell分割的字符串。

由于您似乎在使用支持数组的 shell,因此一种选择是这样做:

CMD=( java some args here "${MAIN_CLASS}" "${MAIN_CLASS_ARGS[@]}" )
exec "${CMD[@]}"

也就是说,构建一个包含所有参数的数组,然后使用带引号的数组扩展,这样可以防止发生分词。

【讨论】:

  • 感谢您的帮助。我直接执行了它,没有包装在变量 cmd 中。
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多