web-dev-qa-db-ja.com

変数値からシェルスクリプトのコマンドに引数を指定するにはどうすればよいですか?

-classpath "classpath-value"フラグをjavacコマンドに渡すシェルスクリプトを作成しようとしています。 CLASSPATH環境変数を使用してクラスパスを設定できることは知っていますが、この方法で行う必要があるのは非常に具体的です。

私が欲しいもの:

$ classpath_val="-classpath \"/opt/Apache-Tomcat-8.5.20/lib/servlet-api.jar\""
$ javac $classpath_val com/example/Test.Java

ただし、2番目のコマンドを実行すると、classpath_valが指定されていないかのように実行されるため、-classpath flagは使用されません。

しかし、同じコマンドをエコーすると、次のようになります:

$ echo javac $classpath_val com/example/Test.Java
javac -classpath "/opt/Apache-Tomcat-8.5.20/lib/servlet-api.jar" com/example/Test.Java

それは完全に正しいです。

なぜこうなった?変数値からコマンドに引数を提供できないのですか?

2
Kashyap Kansara

bashでは、おそらく最も堅牢な方法はarrayを使用することです。

classpath_val=("-classpath" "/opt/Apache-Tomcat-8.5.20/lib/servlet-api.jar")

次に、空白を使用しない方法で各要素を展開します

javac "${classpath_val[@]}" com/example/Test.Java 

配列の構築と展開の両方で要素を引用すると、空白で要素が分割されなくなります。説明する:

$ arr=("foo" "bar baz")
$ set -- "${arr[@]}"
$ for f; do echo "$f"; done
foo
bar baz
3
steeldriver