Linux Shell脚本中正确传递Cron参数至Java命令的问题
问题分析
你遇到的核心问题是Shell变量传递时的引号处理错误:
- 手动添加的转义引号
\"会被保留在变量值中,当你用"$CRON1"传递参数时,整个字符串-Dwhatif.polling.scheduler="0 * * ? * *"会被当成一个单独的参数传递给Java。此时Java解析到的Cron表达式是带双引号的"0 * * ? * *",而非预期的0 * * ? * *,这直接导致Cron解析器报错。 - 直接执行命令时,双引号是Shell用来标记参数边界的语法,不会被传递给Java,所以实际生效的是无引号的正确表达式。
解决方案
推荐使用Shell数组来保存Java参数,这是处理含空格/特殊字符参数最安全的方式:
# 定义Cron表达式变量 WHATIF_POLLING_SCHEDULER="0 * * ? * *" # 将Java参数存入数组(每个元素对应一个独立的Java参数) JAVA_ARGS=("-Dwhatif.polling.scheduler=${WHATIF_POLLING_SCHEDULER}") # 执行Java命令,展开数组参数 java "${JAVA_ARGS[@]}" -jar "$MY_JAR"
如果坚持使用单个变量传递,也可以去掉多余的转义,同时利用Shell的参数展开特性(仅适用于无特殊字符的简单场景):
WHATIF_POLLING_SCHEDULER="0 * * ? * *" CRON1="-Dwhatif.polling.scheduler=${WHATIF_POLLING_SCHEDULER}" # 注意:这里$CRON1不能加双引号,让Shell自动拆分参数 java $CRON1 -jar "$MY_JAR"
提示:数组方式更健壮,尤其是当参数中包含空格、通配符(如
*)时,能避免Shell意外拆分参数。
内容的提问来源于stack exchange,提问作者Jyotsana Nandwani
相关产品推荐
相关产品推荐

