Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java命令行参数中的空格_Java - Fatal编程技术网

Java命令行参数中的空格

Java命令行参数中的空格,java,Java,在我的Java命令行参数中,空格后的任何字符都会被忽略。比如说, java test.AskGetCampaignByName "Dummy books" 我得到的第一个参数(args[0])仅为“Dummy”。单引号也没有帮助。 是否有解决方法/修复方法?可能是因为我的终端设置吗 我的$任期是xTalk,$郎是“eNin in”。 在您的程序需要多于位置参数的情况下(=当命令行使用很重要)时,您应该考虑选项和开关。Apache Commons有一个很好的解决方案。听起来您使用的是一个操作系统

在我的Java命令行参数中,空格后的任何字符都会被忽略。比如说,

java test.AskGetCampaignByName "Dummy books"
我得到的第一个参数(args[0])仅为“Dummy”。单引号也没有帮助。 是否有解决方法/修复方法?可能是因为我的终端设置吗


我的$任期是xTalk,$郎是“eNin in”。

在您的程序需要多于位置参数的情况下(=当命令行使用很重要)时,您应该考虑选项和开关。Apache Commons有一个很好的解决方案。

听起来您使用的是一个操作系统发行版,用户可用的
java
命令是一个包装器,它可以在“某处”找到正确的JVM并相应地调用它

如果是这样,那么在调用实际的
java
可执行文件时,它很可能无法正确地转义参数


您使用的是什么发行版?

参数由shell处理(我假设您在Linux下使用的是Bash?),因此任何终端设置都不应影响这一点

既然你已经引用了这个论点,它应该会起作用。我能想到的唯一可能的解释是,如果您的
java
命令是一个包装器脚本,并且在传递到实际程序时,会弄乱参数的转义。这很容易做到,或者可能有点难以正确做到

正确的包装器脚本应该以
${1+“$@”}
的形式传递其所有参数,任何其他版本都很可能是一个bug,因为它能够正确处理嵌入的空间。正确地执行此操作并不少见,但是任何出现的
$2
或类似情况都很麻烦,必须将其写成
“$2”
(或者可能是
${2+“$2”}
),以便正确地处理嵌入的空格,这是非常不合理的

语法
${1+“$@”}
不那么直观的原因是原始的
$*
将所有参数合并为
“$1$2$3…”
,这对嵌入的空格不起作用。然后引入了
“$@”
,对所有参数(正确地)展开为
“$1”“$2”“$3”“。
,如果未给出任何参数,则应展开为零。不幸的是,一些Unix厂商搞砸了,甚至在没有参数的情况下,也将
“$@”
扩展到
,为了解决这个问题,发明了编写
${1+“$@”}
的聪明(但可读性不太好)技巧,使得
“$@”
仅在设置了参数
$1
时才进行扩展(即在没有参数的情况下避免扩展)

如果我的包装器假设错误,您可以尝试调试:

并找出传递给
execve
的参数。运行“
strace/bin/echo'12'3
”的示例:


只需重新组装Java程序中的参数:

StringBuilder allArgs = new StringBuilder();
for (int i=0; i < args.length; i++)
{
    //System.out.println("arg"+i+": "+args[i]);
    allArgs.append(args[i]+" ");
}
// Parse out the args the way you wish using allArgs
StringBuilder allArgs=new StringBuilder();
对于(int i=0;i
您只需像这样逃离空间:

normal String: "Hello World!"
escaped String: "Hello" "World!"
这对我很管用

我的环境:

23:39:19 Zarathustra@thora:/Users/Zarathustra~$bash -version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.

非常感谢hlovdal!事实正是如此。我们通过设置类路径等的ant构建生成了一个可执行文件。我们在脚本中使用了“java@”。替换${1+“@”}解决了这个问题。很抱歉在我的示例中直接使用java造成误导。我假设这意味着sameVery经过深思熟虑的完整答案。+1建议使用strace。您的答案完美地解决了我的问题。在我的Windows机器上
“hello world”“hello world”“hello world”
作为命令行参数传递将作为args[0(/1)(/2)]==“hello world”拾取,在Linux上这根本不起作用(我不记得它做了什么,因为我不太担心)。但我很高兴看到任何解决方案。谢谢你的提问。@Thorbjørn Ravn Andersen,请详细说明。我如何更改JVM的调用方式?因为
java test.AskGetCampaignByName“Dummy books”
books
之间有多个空格的
将失败(哪个堆栈溢出作为单个空间输出,所以您在这里看不到它…)因为
java
首先应该正确地从shell获取命令行参数。您没有转义任何内容,只是将一个参数分解为两个参数,而这根本不是OP所要求的。空格不需要转义,它们只需要引用。
normal String: "Hello World!"
escaped String: "Hello" "World!"
23:39:19 Zarathustra@thora:/Users/Zarathustra~$bash -version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.