shell 脚本中的变量值替换

问题描述 投票:0回答:2

假设在 Linux shell 脚本中,我有

WHATIF_POLLING_SCHEDULER="0 * * ? * *"
。 现在我会:
ESCAPED_WHATIF_POLLING_SCHEDULER=\"${WHATIF_POLLING_SCHEDULER}\"

CRON1="-Dwhatif.polling.scheduler=$ESCAPED_WHATIF_POLLING_SCHEDULER"

最后,我必须执行

java -jar $MY_JAR
并在其中传递这个 cron 参数。 所以,当我这样做时
java "$CRON1" -jar $MY_JAR
我收到类似“cron 解析器中的值无效”的错误

如果我简单地替换值

java -Dwhatif.polling.scheduler="0 * * ? * *" -jar $MY_JAR
,它就可以正常工作。 我需要在Java命令中正确传递CRON1变量。

linux bash cron sh variable-assignment
2个回答
3
投票

我不确定你想用

ESCAPED_WHATIF_POLLING_SCHEDULER=\"${WHATIF_POLLING_SCHEDULER}\"
做什么。

请注意,

java -Dwhatif.polling.scheduler="0 * * ? * *" -jar "$MY_JAR"
在参数值中并不真正包含引号。引号是 shell 语法的一部分。

从 shell 的角度来看,以下命令 100% 相同:

  • java "-Dwhatif.polling.scheduler=0 * * ? * *" -jar "$MY_JAR"
  • java -D"whatif.polling.scheduler"="0 * * ? * *" -jar "$MY_JAR"
  • java -D"whatif.polling.scheduler=0 * * ? * *" -jar "$MY_JAR"
  • java -Dwhatif.polling.scheduler=0" ""*"" ""*"" ""?"" ""*"" "*" -jar "$MY_JAR"
  • java -Dwhatif.polling.scheduler=0\ \*\ \*\ \?\ \*\ \* -jar "$MY_JAR"
  • java -Dwhatif.polling.scheduler='0 * * ? * *' -jar "$MY_JAR"
  • java -Dwhatif.polling."scheduler=0 * * ? * *" -jar "$MY_JAR"

因此您执行的命令相当于:

java -Dwhatif.polling.scheduler='"0 * * ? * *"' -jar "$MY_JAR"

你真的想跑步:

WHATIF_POLLING_SCHEDULER='0 * * ? * *'
java -Dwhatif.polling.scheduler="$WHATIF_POLLING_SCHEDULER" -jar "$MY_JAR"

或者也许:

WHATIF_POLLING_SCHEDULER='0 * * ? * *'
CRON1="-Dwhatif.polling.scheduler=$WHATIF_POLLING_SCHEDULER"
java "$CRON1" -jar "$MY_JAR"

无需在值中嵌入引号,因为引号实际上并不是值的一部分。


1
投票

变量

CRON1
包含字符串
-Dwhatif.polling.scheduler="0 * * ? * *"
,这就是 Java 作为第一个参数获得的,而当您键入运行良好的代码版本时,Java 将字符串
-Dwhatif.polling.scheduler=0 * * ? * *
作为第一个参数。

我猜 Java 只是因为参数中的双引号而感到不安。您在计算

ESCAPED_WHATIF_POLLING_SCHEDULER
时添加了它们,所以您应该这样做

 CRON1="-Dwhatif.polling.scheduler=$WHATIF_POLLING_SCHEDULER"

或者从

CRON1
变量的内容中删除双引号(即 pass

"${CRON1//'"'//}" 

到java)

© www.soinside.com 2019 - 2024. All rights reserved.