如何将参数传递给命令行Java程序并转义所有特殊字符?

时间:2015-08-28 21:42:55

标签: java bash command-line

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

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

bash脚本在我的路径中,所以我可以通过输入

直接调用该程序
<projectName> arg1 arg2 arg3

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

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

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

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

<projectName> arg1 arg&2 arg3

我希望此输入与此相同:

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

但我正在寻找一种方法,不必强迫用户逃避特殊字符本身(在幕后做所有事情)。

2 个答案:

答案 0 :(得分:1)

您可以在每个参数周围加上单引号(&#39;)。我不确定这是否算作&#34;逃避&#34;但是这些论点。

答案 1 :(得分:1)

您需要在命令行上引用/转义&符号。输入如下命令时:

<projectName> arg1 arg&2 arg3

shell将其解析为两个单独的命令<projectName> arg1 arg2 arg3,并确定第一个命令应该是后台的。您的脚本无法看到2 arg3(这是一个单独的命令),甚至是&(这是命令后的分隔符)。所有这一切都在脚本运行之前就已经确定了,实际上甚至在shell出现之前就确定<projectName>对应于你的脚本。

你的脚本完全没有控制任何一个

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