有没有办法找出传递给jar的参数被引用?

时间:2013-02-20 14:15:24

标签: java shell arguments

我正在尝试将一些参数传递给我的Java应用程序,但是我想自己使用智能解析器来解析它们,这个解析器不仅仅依靠空格来分隔参数。一个例子:

/update source=foo func=(bar, foo ,foo,bar)

通过将所有内容转换为令牌然后解析它们,这一切都很好用。但是,当我添加:

时会出现问题
path="./foo/bar/foo  bar.txt"

(注意foo和bar之间的双倍空格)。

当我使用双引号时,参数作为单个字符串传递,保留双倍空格。引号如下所示被删除:

path=./foo/bar/foo  bar.txt

这使我的解析器失败。但是当我尝试使用其他字符作为引号时,比如',解析器工作正常,但是shell将字符串作为两个单独的字符串传递,在双空格中分隔,因此我丢失了有两个空格的信息

我可以做什么来使用双引号传递参数来保持文字字符串表示,还保留引用字符串的信息,而无需用户输入奇怪的结构,如“'string'”?我正在使用Java,也许有一种方法可以获得shell解析的整个参数行?或者只是没有删除引号?

顺便说一下,我是从microsoft命令行运行的,还没有尝试过unix shell,甚至可能在我在interwebs上读到的单引号上失败

2 个答案:

答案 0 :(得分:1)

在Windows命令行上(使用cmd.exe),您可以使用\"转义双引号。例如,

java MyApp path=\"./foo/bar/foo bar.txt\"

将导致

args[0] = path="./foo/bar/foo
args[1] = bar.txt"

java MyApp path="\"./foo/bar/foo  bar.txt\""

会给你

args[0] = path="./foo/bar/foo  bar.txt"

答案 1 :(得分:0)

感谢我的帮助,但我已经明白了:

  • 我知道可以引用的内容不包含括号,逗号或等号,我的解析器识别的内容。

  • 我知道如果某些内容被引用并且它包含空格,那么这些空格仍然存在于分割参数中。

  • 我知道原始的参数字符串在空格的每个区域都是分开的,因此最终的分割参数不包含空格,只包含引用部分中的空格。

因此,我可以假设,如果我解析一个split参数,那里的任何空格都不会暗示必须生成一个新的令牌,因此它会保留在最终的字符串令牌中。

我现在只需重写我的tokenizer来接受一个参数数组,而不是我现在从我在main()方法中传递的args数组创建的连接字符串。这样我可以区分跳过真正的空白(进入数组的下一个元素)和引用的空格(任何其他空格)。