我正在尝试编写一个 shell 脚本,希望在其中将标志传递-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
但是,当我执行第二条命令时,它只是像没有提供 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
这是完全正确的。
为什么会发生这种情况?是不是因为我无法从变量值向命令提供参数?
答案1
在bash
,可能最可靠的方法是使用大批例如
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