Java命令行参数中的空格

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

java test.AskGetCampaignByName "Dummy books" 

我得到第一个参数(args [0])仅为“Dummy”。 单引号也没有帮助。 有没有人知道任何解决方法/修复此问题? 可能是因为我的终端设置? 我的$ TERM是xterm,$ LANG是“en_IN”。

参数由shell处理(我假设您在linux下使用bash?),因此任何终端设置都不应该影响这一点。 既然你已经引用了它应该起作用的论点。 我能想到的唯一可能的解释是,如果你的java命令是一个包装器脚本,并且在传递给真正的程序时会弄乱参数的转义。 这很容易做到,或者可能有点难以正确完成。

正确的包装器脚本应该将其所有参数传递为${1+"$@"} ,任何其他版本很可能是关于能够正确处理嵌入空间的错误。 这种做法并不罕见,但是任何$2或类似的事件都很麻烦,必须写成"$2" (或可能是${2+"$2"} )以便正确处理嵌入空间,这是犯罪反对很多。

不那么直观的语法${1+"$@"}是原始$*将所有参数加入为"$1 $2 $3 ..." ,这对于嵌入空间不起作用。 然后引入"$@" (正确)扩展到"$1" "$2" "$3" ...对于所有参数,如果没有给出参数,它应该扩展为空。 不幸的是,一些unix供应商搞砸了,即使在没有参数的情况下也将"$@"扩展为"" ,为了解决这个问题,我发明了写出${1+"$@"}的聪明(但不那么可读)黑客,如果设置参数$1"$@"仅展开(即在没有参数的情况下避免扩展)。

如果我的包装器假设错误,您可以尝试使用strace进行调试

 strace -o outfile -f -ff -F java test.AskGetCampaignByName "Dummy books" 

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

 execve("/bin/echo", ["/bin/echo", "1 2", "3"], [/* 93 vars */]) = 0 brk(0) = 0x2400000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f420075b000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f420075a000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/usr/lib64/alliance/lib/tls/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory) stat("/usr/lib64/alliance/lib/tls/x86_64", 0x7fff08757cd0) = -1 ENOENT (No such file or directory) open("/usr/lib64/alliance/lib/tls/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory) ... 

你只需要逃离这样的空间:

 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. 

如果您的程序需要的不仅仅是位置参数(=当命令行使用很重要时),您应该考虑选项和开关。 Apache Commons有一个很棒的库 。

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

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

你用什么发行版?

这个问题有点旧,但为什么不重新组装java程序中的args?

 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