如何在 Shell 脚本中向命令提供变量值的参数?

如何在 Shell 脚本中向命令提供变量值的参数?

我正在尝试编写一个 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

相关内容