【问题标题】:Special character($) handling in linux & javalinux和java中的特殊字符($)处理
【发布时间】:2017-08-09 05:09:05
【问题描述】:

我正在尝试将字符串作为命令行参数传递给 java 程序以进行某些处理,并且它工作正常,除了传递的字符串参数具有一些特殊字符(如 $)的情况。做一个SOP,我发现参数本身已经被一些随机数而不是特殊字符扭曲了。这仅在 Linux 中发生,并且仅在参数具有某些特殊字符时发生。

$ java -jar testclient.jar  String$$123
String 1 = String31733123

【问题讨论】:

  • 引用它。 java -jar testclient.jar 'String$$123'
  • $$ 是进程 ID。如果您不希望外壳用数字替换它,则需要对其进行转义。例如'String$$123'
  • 那些(很可能都是)特殊的 bash 变量:gnu.org/software/bash/manual/html_node/Variable-Index.html - 你需要“转义”它们(例如:用引号括起你的参数)
  • 但在 Linux 中,其他特殊字符(如 !、$、&、(、) 也会出现此问题。有什么办法可以确保 java 解析这些字符串输入,而不使用转义序列?

标签: java linux special-characters sign dollar-sign


【解决方案1】:

这仅在 Linux 中发生并且仅在参数包含一些特殊字符时发生。

那是因为是 Linux shell 与 $ 字符“混淆”,而不是 Java。

$ 是一个 shell 元字符。具体来说,它引入了 shell 参数扩展。根据$ 字符后面的字符,shell 将用其他字符替换它/它们。然后将修改后的字符用于传递给java 可执行文件的命令行参数。

您可以在此处找到有关 shell 参数扩展(用于“bash” shell)的文档:

请注意,在 Mac OSX 命令行以及 UNIX 和 Linux 的其他方言中也会发生同样的事情。


如果您希望$ 字符按原样传递,则需要引用它。此处描述了执行此操作的各种方法:

事实上,您可能应该阅读整个“bash”手册……或教程。从长远来看,它将为您节省大量时间。


有没有什么办法可以确保 java 不使用转义序列来按原样解析这些字符串输入?

没有。在 Java 看到命令行参数时,“损坏”已经完成。

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    相关资源
    最近更新 更多