【问题标题】:passing string with spaces from shell to java [duplicate]将带有空格的字符串从shell传递到java [重复]
【发布时间】:2016-12-05 22:43:34
【问题描述】:

我正在做一个简单的工作,将我的 java 参数从 shell 传递到 java,其中一个参数恰好有空格。

./test.ksh -test param1 param2 "\"param3 带空格\""

test.ksh 中的代码

if [ "$1" = "-test" ]
then
   echo "Test"
   SCRIPT_ARG="${*}"
   echo "${SCRIPT_ARG}"
fi

java -jar test.jar ${SCRIPT_ARG}

但在 java 代码中,第三个参数被读取并打印为

"参数3

看起来很简单,但是这里没有思路

【问题讨论】:

  • 将带空格的字符串直接传递给java没有问题:java <classname> "abc def" "ghi"
  • 这实际上比看起来更棘手,但它在这里得到了回答(不是公认的答案;查看第二个或其他答案):stackoverflow.com/a/8723305/719547
  • 试试 java -jar test.jar "param with spaces" 或者只是将 ${SCRIPT_ARG} 括在空格中:java -jar test.jar "${SCRIPT_ARG}"

标签: java shell


【解决方案1】:

参数是一个字符串列表,但是你可以将它们连接成一个字符串,然后在空格上重新分割。

相反,不要将它们连接起来,而是将它们作为字符串列表处理:

#!/usr/bin/ksh

if [ "$1" = "-test" ]
then
   echo "Test"
   script_arg=( "${@}" )
   for i in "${script_arg[@]}"
   do
     echo "One of the arguments is: $i"
   done
fi

java -jar test.jar "${script_arg[@]}"

然后你应该运行它:

./test.ksh -test param1 param2 "param3 with spaces"

不要尝试嵌入更多引号。

【讨论】:

  • 您需要将-test arg 关闭。
  • OP 没有这样做或提到这一点,但也许。
  • 你是对的,但我认为 OP 也是这个意思。无论如何,请参阅我的问题评论中的 dup 链接;这也是那里的答案之一。
  • 感谢您的回复,所以关键是“${script_arg[@]}”,此时包括引号中的每个参数。如果我在引号中传递引号(带有转义),为什么 java 不接受它作为引号参数?
  • 引号是 ksh 用来填充 Java 程序的 String[] args 的 shell 语法。 Java 不知道也不解释引号。如果您调用 main(new String[] { "foo", "\"bar", "baz\"" }),您显然还会在数组中看到 3 个元素,而不是 2 个。文字引号无关紧要,也不会重新解释。
猜你喜欢
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 2013-10-21
相关资源
最近更新 更多