私は現在、アーカイブファイルへのパスを引数として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に何も追加しようとせずに、任意の文字列リテラルを受け入れるようにすることは可能ですか?文字のエスケープは機能していないようです。可能な場合は、それが唯一のオプションである可能性があります。
前もって感謝します。