将包含空格的shell脚本参数作为java系统属性传递

时间:2014-03-31 14:35:29

标签: java shell

有一个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

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

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

3 个答案:

答案 0 :(得分:4)

不是将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来支持它们,所以这种方法不是最容易移植的。如果使用这种方法,请确保脚本的第一行是{ {1}}或#!/bin/bash而不是#!/bin/zsh。)

答案 1 :(得分:0)

$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'"'"

答案 2 :(得分:0)

我找到的唯一解决方案是为有问题的参数

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

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