Java命令行传带空格字符串须用引号包裹,单引号禁变量展开,双引号允变量展开;args数组已由JVM去引号,无需手动处理;含引号或特殊字符需按平台转义或混用引号。

Java 命令行中传递带空格的字符串,必须用引号包裹,否则空格会被 shell 当作参数分隔符,导致参数被错误切分。
单引号 vs 双引号:关键区别
Linux/macOS 下:
- 单引号(')完全禁止变量展开和转义,适合字面量字符串,例如:java MyApp 'Hello World' '$HOME' → 第二个参数就是字面量 $HOME,不会展开
- 双引号(")允许变量展开和部分转义(如 "\n"、"\$HOME"),例如:java MyApp "Hello World" "$HOME" → 第二个参数是当前用户的家目录路径
Windows cmd 中两者效果相同(都禁用变量展开),但推荐统一用双引号;PowerShell 则更接近 Linux 的双引号行为,需注意 $、` 等特殊字符。
Java 程序内无需额外解析引号
main 方法接收的 String[] args 已由 JVM 和 shell 共同完成拆分与去引号。你看到的就是干净的字符串:
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
public static void main(String[] args) {
System.out.println(args[0]); // 输出:Hello World(不含引号)
}
不需要手动调用 args[0].trim().replaceAll("^\"|\"$", "") —— 这是常见误区。
含引号本身或特殊字符时的处理技巧
如果字符串本身要包含双引号(如 He said "Hi"),可混合使用引号或转义:
- Linux/macOS:java MyApp 'He said "Hi"' 或 java MyApp "He said \"Hi\""
- Windows cmd:java MyApp "He said ""Hi"""(两个连续英文双引号表示一个字面双引号)
- 避免在参数中直接写未转义的 &、|、;、、>,它们会在 shell 层被解释
调试建议:先用 echo 验证 shell 拆分结果
不确定参数是否传对?临时用 echo 替代 java:
- Linux/macOS:echo 'arg1' 'arg with space' 'arg3'
- Windows:echo arg1 "arg with space" arg3
观察输出是否符合预期,再换成 java 命令执行。

















