假设在 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变量。
我不确定你想用
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"
无需在值中嵌入引号,因为引号实际上并不是值的一部分。
变量
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)