有一个 shell 脚本,它反过来运行一个 java 程序。脚本调用如下:
./script.sh 1 2 3 4 "ab cd"
Run Code Online (Sandbox Code Playgroud)
第 5 个 shell 参数(ab cd)必须作为 java 系统属性传递,我正在做的是:
JAVA_OPTS="-Xmx512M -Dlog4j.defaultInitOverride=true"
if [ "$5" ] ; then
JAVA_OPTS="$JAVA_OPTS -Dconfig.path=$5"
fi
Run Code Online (Sandbox Code Playgroud)
然后,运行 java(JAVA_EXE 和 CP 有正确的值):
$JAVA_EXE $JAVA_OPTS -classpath $CP com.foo.Main
Run Code Online (Sandbox Code Playgroud)
收到此错误:
Error: Could not find or load main class cd
Run Code Online (Sandbox Code Playgroud)
如果传递“abcd”而不是“ab cd”,则一切正常。
如果传递内联,只需用引号将值括起来:
java -Xmx512M -Dconfig.path="ab cd" com.foo.Main
Run Code Online (Sandbox Code Playgroud)
当必须使用变量时会出现问题。
我应该如何正确传递包含空格的参数?
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
Run Code Online (Sandbox Code Playgroud)
(注意:Bourne shell 没有数组,而且 POSIX 不需要 shell 来支持它们,所以这种方法不是最大的可移植性。如果你使用这种方法,请确保你的脚本的第一行是类似#!/bin/bashor#!/bin/zsh而不是什么喜欢#!/bin/sh。)