为什么在作为命令行参数传递时,双引号会被去掉?
这是完整的文件,名为 test.java。
void main(final String[] args)
{
IO.println("args.length = " + args.length);
IO.println("Each line of args below.");
Arrays
.stream(args)
.forEach(IO::println)
;
}
下面是我用它做的一些示例运行:
$ java test.java
args.length = 0
Each line of args below.
$ java test.java a b c
args.length = 3
Each line of args below.
a
b
c
按预期工作。
但后来,我尝试对其中一些情况使用双引号,结果遇到了意料之外的行为。
$ java test.java "a" "b" "c"
args.length = 3
Each line of args below.
a
b
c
我的双引号去哪儿了?
我遇到的更大情形是在通过在命令行把压缩后的JSON作为命令行参数传给我的Java文件来解析它时。由于JSON字符串被双引号包裹,所以我在那里注意到了这种行为。
下面是一些相关的调试细节:
$ java --version
openjdk 26.0.1 2026-04-21
OpenJDK Runtime Environment (build 26.0.1+8-34)
OpenJDK 64-Bit Server VM (build 26.0.1+8-34, mixed mode, sharing)
我在Windows 11上,使用Git Bash运行。
解决方案
问题在于,终端在Java还来不及处理它之前,实际上就已经把双引号去除了。
当你在终端中把内容放在双引号里,Git Bash(以及几乎所有其他终端)会尝试通过对双引号中的内容进行求值来帮助你,例如把 "$abc" 替换为变量在 abc 处的实际值。实际上,这正是这里发生的情况。它会尝试对双引号进行求值,求值完成后再把双引号去掉。
如果你实际需要的是双引号本身,可以在Git Bash上用反斜杠对它们进行转义。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。