如何传递包含带空格作为Java参数的目录的bash参数?

时间:2012-08-27 19:17:54

标签: java linux bash shell

我目前正在尝试创建一个执行Java主类的bash脚本,其中包含一个存档文件的路径作为参数。我想确保它可以处理该路径中的空间,这让我有点头疼。

我想将该路径设置为环境变量,并在执行主类时调用它,因此脚本看起来像这样:

export ArgPath='/Foo Path/foo.zip'

$JAVA_HOME/bin/java -cp ./foo.jar foopackage.main -a $ArgPath

不幸的是,当我在Bash中执行此命令时,命令就会出现:

/foo_Java_Home/bin/java -cp ./foo.jar foopackage.main -a /Foo Path/foo.zip

Java参数不能包含空格。 Java将“/ Foo”和“Path / foo.zip”视为两个独立的参数。好的,那不是问题。 Java可以处理带空格的参数。我需要找到一些方法来获得双引号或单引号。我会尝试绕过路径的双引号。该脚本现在看起来像这样:

export ArgPath='\"/Foo Path/foo.zip\"'

$JAVA_HOME/bin/java -cp ./foo.jar foopackage.main -a $ArgPath

Bash给了我这个......

/foo_Java_Home/bin/java -cp ./foo.jar foopackage.main -a '\"/Foo' 'Path/foo.zip\"'

...仍然导致Java将它们视为两个独立的参数(更不用说它无论如何都不能作为单个参数工作)。我已经尝试过使用单引号,双引号和转义单引号/双引号/空格的每种组合和排列我能想到的。有没有办法提供所需的

输出
'/Foo Path/foo.zip'

或     “/ Foo Path / foo.zip”

在Bash?就此而言,是否有可能让Bash接受任意字符串文字而不试图在这些情况下向它添加任何内容?转义字符似乎不起作用,因此如果可能的话,这可能是唯一的选择。

提前致谢。

1 个答案:

答案 0 :(得分:4)

在命令调用中将变量括在双引号中:

export ArgPath='/Foo Path/foo.zip'

$JAVA_HOME/bin/java -cp ./foo.jar foopackage.main -a "$ArgPath"

请注意,这通常适用于调用任何命令(不仅仅是Java)。如果参数包含空格(等),请将其括在引号(单引号或双引号)中。当参数在变量中时,请使用双引号。