为什么在作为命令行参数传递时,双引号会被去掉?

编程语言 2026-07-08

这是完整的文件,名为 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章