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

标签 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

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

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

最佳答案

不是将 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/

相关文章:

java - 带有另外 2 个 servlet 的调度程序

java - Android 磨损保护

java - 在一行中使用 replace() 替换很多东西

linux - 脚本中的 'if' 语句出现问题

linux - 在一行中使用 awk 和 stat 来打印 stat 的值

shell - 我如何比较shell中的2个字符串?

java - 如何初始化 Spring Data JPA 规范?

java - 不能从静态上下文中引用非静态变量

linux - Bash 脚本 - 试图获取脚本路径

Android:使用 ADB shell 读取 APN