有一个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
必须使用变量时会出现问题。
我应该如何正确传递包含空格的参数?
答案 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
它必须有一些值,否则空值将被视为主类的名称。