【问题标题】:How can I pass in arguments to a command line Java program and escape all special characters?如何将参数传递给命令行 Java 程序并转义所有特殊字符?
【发布时间】:2015-08-28 21:42:55
【问题描述】:

我有一个命令行 Java 程序,我通过 bash 脚本传递参数。该行位于我的 bash 脚本文件中,如下所示:

java -cp "$PROJECT_LOC" Main.main "@$"

bash 脚本在我的路径中,所以我可以通过输入直接调用程序

<projectName> arg1 arg2 arg3

直接进入我的终端(我在 OS X Yosemite 上)。

当一个&符号作为参数传入时,它不会被读取为普通的&符号,而是作为执行某些过程的特殊字符&符号。 但是,我希望能够简单地将 & 号作为参数传递,而不必让程序的用户手动转义字符。

有没有办法在我的 bash 脚本中处理一个 & 符号(或任何其他特殊字符)的传入,这样输入中的任何和所有特殊字符都将被转义,然后作为(现在清理) Java 程序的参数?

编辑:为了更清楚,我希望能够在我的终端中执行以下操作:

<projectName> arg1 arg&2 arg3

我希望这个输入等同于这个:

<projectName> 'arg1' arg&2' 'arg3'

但我正在寻找一种不必强迫用户自己转义特殊字符的方法(在幕后做所有事情)。

【问题讨论】:

  • 尝试用引号括起来。
  • 不可能。 bash 具有某些特殊处理的字符,您必须引用它们以禁止这种处理。

标签: java bash command-line


【解决方案1】:

您可以在每个参数周围加上单引号 (')。不过,我不确定这是否算作“逃避”论点。

【讨论】:

  • 结果相同。但是,我正在寻找一种不必强迫我的程序用户自己执行此操作的方法。
  • @AdrianM 我不认为你可以避免它。如果特殊字符没有被引用,它们会在调用命令之前由 shell 处理。你的程序永远不会看到它们。
【解决方案2】:

您需要在命令行中引用/转义与号。当您输入如下命令时:

<projectName> arg1 arg&2 arg3

shell 将其解析为两个单独的命令,&lt;projectName&gt; arg1 arg2 arg3,并决定第一个应该是后台的。您的脚本看不到2 arg3(这是一个单独的命令)甚至&amp;(这是命令后的分隔符)。所有这些都是在你的脚本运行之前决定的,实际上甚至在 shell 开始确定&lt;projectName&gt; 对应于你的脚本之前。

您的脚本对所有这些都具有精确的零控制

换一种说法:命令行将根据标准 shell 语法进行解析,标准 shell 语法表示未转义/未加引号的 & 符号是命令之间的分隔符。您的脚本不能使自己成为此语法的例外。

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 2011-05-20
    • 2015-10-30
    相关资源
    最近更新 更多