1

私は現在、アーカイブファイルへのパスを引数として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」を2つの別個の引数として扱います。さて、それは問題ではありません。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はそれらを2つの別個の引数として扱います(とにかく単一の引数として機能しないことは言うまでもありません)。一重引用符、二重引用符を使用し、考えられる一重引用符/二重引用符/スペースをエスケープするすべての組み合わせと順列を試しました。の望ましい出力を提供する方法はありますか

'/Foo Path/foo.zip'

または「/FooPath/foo.zip」

バッシュでは?さらに言えば、このような状況でBashに何も追加しようとせずに、任意の文字列リテラルを受け入れるようにすることは可能ですか?文字のエスケープは機能していないようです。可能な場合は、それが唯一のオプションである可能性があります。

前もって感謝します。

4

1 に答える 1

4

コマンド呼び出しでは、変数を二重引用符で囲みます。

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

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

これは通常、(Javaだけでなく)任意のコマンドの呼び出しに適用されることに注意してください。引数にスペース(など)が含まれている場合は、引用符(シングルまたはダブル)で囲みます。引数が変数内にある場合は、二重引用符を使用してください。

于 2012-08-27T19:19:15.167 に答える