0
点赞
收藏
分享

微信扫一扫

Shell 脚本中执行命令参数带空格

hoohack 2022-02-10 阅读 80


事情的背景很简单、最终解决方案也很简单,但是,但是解决的过程可是苦了!

此时百度、谷歌都没好使,不过问题最终还是得以解决。

下面先还原一下需求场景:


1、有一个 springboot 的 jar 程序 demo.jar
2、通过接收外部参数来覆盖内部 properties 配置中 key 为 ​​message​​ 的值
3、shell 中直接执行命令 ​​java -jar -Dmessage="shanhy hello world" demo.jar​​ 正常,但是实际的需求是其中的参数可以填写多个,且不固定! 总之实际要求是下面的脚本内容(用变量的方式)


#!/bin/bash
export MSG="shanhy hello world"
export JAVA_OPTS="$JAVA_OPTS -Dmessage='$MSG'"
java -jar $JAVA_OPTS demo.jar

这段脚本,咋一看似乎没什么问题,但是实际执行起来是错误的,因为空格会截断命令!

期间使用了好多种拼接的方法,包括使用 ​​\​​​ 转译 ​​"​​ 等等。

过程就不赘述了,最终解决问题正确脚本内容如下:

#!/bin/bash
export MSG="shanhy hello world"
export JAVA_OPTS="$JAVA_OPTS -Dmessage='$MSG'"
echo "java -jar $JAVA_OPTS demo.jar"|sh

通过脚本可以看出,使用 ​​echo​​ 输出脚本来达到自动执行的目的,一种很好的变通方式。

上文用示例的方式模拟了需求场景并进行了解决,其实本文案例的真实需求是这样的:

业务微服务配置文件中的 ​​spring.datasource.validation-query​​ 需要在 jar 包启动服务的时候传参提供,而启动文件是一个通用且固定的 ​​startup.sh​​ 文件,该文件内部仅接收 ​​JAVA_OPTS​​ 参数,所以 ​​JAVA_OPTS=$JAVA_OPTS -Dspring.datasource.validation-query=SELECT 1 FROM DUAL​​ 是在系统环境变量中配置的。

如果你还有其他更好的办法,欢迎留言赐教。

(END)



举报

相关推荐

0 条评论