有一个 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_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 来支持它们,所以这种方法不是最大可移植的。如果你使用这种方法,请确保你的脚本的第一行类似于 #!/bin/bash
或 #!/bin/zsh
而不是像 #!/bin/sh
这样的东西。)
关于java - 传递包含空格的 shell 脚本参数作为 java 系统属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22764441/