禁用bash脚本输入参数替换

禁用bash脚本输入参数替换,bash,shell,sh,Bash,Shell,Sh,Java进程调用Bash脚本,如下所示: ./spark_submit.sh ${SPARK_HOME}/bin/spark-submit --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address=${hadoopconf-yarn.resourcemanager.hostname}:18080 我必须对输入参数运行操作,所以我检查每个参数并重建原始输入 我通过访问$1值,然后移位,一个接一个地获取

Java进程调用Bash脚本,如下所示:

 ./spark_submit.sh ${SPARK_HOME}/bin/spark-submit --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address=${hadoopconf-yarn.resourcemanager.hostname}:18080
我必须对输入参数运行操作,所以我检查每个参数并重建原始输入

我通过访问$1值,然后移位,一个接一个地获取参数

我没有找到阻止bash解决问题的方法

${SPARK_HOME}/bin/SPARK提交

/bin/spark提交

${hadoopconf.resourcemanager.hostname}

warn.resourcemanager.hostname

Java进程不能以不同的方式传递参数,例如使用转义斜杠

有什么想法吗

用in'(单引号)传递它。单引号防止扩展

也就是说,类似于:

./spark_submit.sh '${SPARK_HOME}/bin/spark-submit' --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address='${hadoopconf-yarn.resourcemanager.hostname}:18080'
用in'(单引号)传递它。单引号防止扩展

也就是说,类似于:

./spark_submit.sh '${SPARK_HOME}/bin/spark-submit' --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address='${hadoopconf-yarn.resourcemanager.hostname}:18080'

只有当shell是shell脚本的父进程,在脚本启动之前将单个字符串分解为参数列表(并对其运行扩展)时,才会出现此问题。这通常发生在使用编程语言模拟C
system()
函数时,该函数接受单个字符串并将其作为参数传递给
sh-C'…'

由于该过程发生在脚本启动之前,您无法从脚本内部修复它

将文本参数列表传递到JVM中,您不会遇到这个问题:


列出它如何处理参数;请注意,传入的值是经过审核/审查/控制的,或者(更好!)让人重写它以避免使用
eval

只有在shell脚本的父进程是shell时,才会出现此问题,将单个字符串分解为参数列表(并对其进行扩展)在脚本开始之前。这通常发生在使用编程语言模拟C
system()
函数时,该函数接受单个字符串并将其作为参数传递给
sh-C'…'

由于该过程发生在脚本启动之前,您无法从脚本内部修复它

将文本参数列表传递到JVM中,您不会遇到这个问题:


列出它如何处理参数;请注意,传入的值是经过审核/审查/控制的,或者(更好!)让人重写它以避免使用
eval

我不确定您希望脚本看到什么。如果您希望使用literal
${SPARK\u HOME}/bin/SPARK submit
而不是扩展的
/bin/SPARK submit
,请将参数括在单引号中。向我们展示脚本的相关部分。如果将
echo“$@”放入脚本,脚本的输出是什么;从一开始就退出
?如果打印的不是
${SPARK_HOME}…
,而是实际值,那么在脚本启动之前就已经进行了变量扩展,无法解决此问题。我不确定您希望脚本看到什么。如果您希望使用literal
${SPARK\u HOME}/bin/SPARK submit
而不是扩展的
/bin/SPARK submit
,请将参数括在单引号中。向我们展示脚本的相关部分。如果将
echo“$@”放入脚本,脚本的输出是什么;从一开始就退出
?如果打印的不是
${SPARK\u HOME}…
,而是实际值,那么在脚本启动之前就已经发生了变量扩展,无法解决这个问题。