【问题标题】:Pass shell script argument containing spaces as java system property将包含空格的 shell 脚本参数作为 java 系统属性传递
【发布时间】:2014-03-31 14:35:29
【问题描述】:

拥有一个 shell 脚本,该脚本又运行一个 java 程序。 脚本调用如下:

./script.sh 1 2 3 4 "ab cd"

第 5 个 shell 参数(ab cd)必须作为 java 系统属性传递,我正在做的是:

JAVA_OPTS="-Xmx512M -Dlog4j.defaultInitOverride=true"
if [ "$5" ] ; then
  JAVA_OPTS="$JAVA_OPTS -Dconfig.path=$5"
fi

然后,运行 java (JAVA_EXE & CP 有合适的值) :

$JAVA_EXE $JAVA_OPTS -classpath $CP com.foo.Main

收到此错误:

Error: Could not find or load main class cd

如果通过 "abcd" 而不是 "ab cd" 一切正常。

如果传递内联,只需用引号将值括起来:

java -Xmx512M -Dconfig.path="ab cd" com.foo.Main

当必须使用变量时会出现问题。

我应该如何正确传递包含空格的参数?

【问题讨论】:

    标签: java shell


    【解决方案1】:

    您可以将其构建为数组,而不是将JAVA_OPTS 构建为一个字符串:

    JAVA_OPTS=(-Xmx512M -Dlog4j.defaultInitOverride=true)
    if [ "$5" ] ; then
      JAVA_OPTS+=("-Dconfig.path=$5")
    fi
    "$JAVA_EXE" "${JAVA_OPTS[@]}" -classpath "$CP" com.foo.Main
    

    (注意:Bourne shell 没有数组,POSIX 不需要 shell 来支持它们,所以这种方法不能最大限度地移植。如果使用这种方法,请确保脚本的第一行类似于 @ 987654323@ 或 #!/bin/zsh 而不是 #!/bin/sh。)

    【讨论】:

    • 它有效(尽管我不会冒险)。标记为已接受,因为没有给出更好的响应。
    【解决方案2】:

    我找到的唯一解决方案是对有问题的参数使用特殊变量

    CONFIG_PATH="-Da=a"
    if [ "$5" ] ; then
      CONFIG_PATH=-Dconfig.path=$5
    fi
    $JAVA_EXE $JAVA_OPTS "$CONFIG_PATH" -classpath $CP com.foo.Main
    

    它必须有一些值,否则将空值作为主类的名称。

    【讨论】:

      【解决方案3】:

      $JAVA_EXE $JAVA_OPTS -classpath $CP com.foo.Main 必须是 $JAVA_EXE "$JAVA_OPTS" -classpath $CP com.foo.Main - 注意 $CP 周围的双引号

      编辑:JAVA_OPTS="$JAVA_OPTS -Dconfig.path=$5" 也应该是 JAVA_OPTS="$JAVA_OPTS -Dconfig.path='"'$5'"'"

      【讨论】:

      • 不起作用:最大堆大小无效:-Xmx512M -Dlog4j.defaultInitOverride=true -Dconfig.path=ab cd
      猜你喜欢
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 2013-08-23
      • 2015-03-28
      • 2013-01-15
      • 1970-01-01
      • 2014-05-02
      相关资源
      最近更新 更多