【发布时间】:2020-05-20 13:27:15
【问题描述】:
我对 shell 脚本非常陌生,我想创建和运行 shell 脚本。
我想在 simu 和 prod 这两个不同的环境中运行我的 java 程序。
如果我在 simu 环境中运行程序,则执行 SIMU_RUN,否则执行 PROD_RUN。
例如,我有两个目录,其中文件放置在 /data/etl-simu/in/ 和 /data/etl-prod/in/ 中,正如您在从目录名称读取文件时看到的那样,我可以从 SIMU_PATH 或 @ 识别环境是 simu 还是 prod 987654326@变量。
我不确定编写这样的 shell 脚本并执行它是否容易。
如果我只是创建普通的 shell 脚本并将完整的 SIMU_RUN 或 PROD_RUN 路径放入该 shell 脚本并在相应的环境中执行它,那么它将运行良好。
但是由于我有两个环境,所以我想让这个 shell 脚本灵活,而不是为 simu 和 prod 创建两个单独的 shell 脚本
#!/bin/sh
SIMU_RUN="cd /opt/env/import/import/current; java -Dlog4j.configurationFile=/opt/import/config/logging/log4j2_Importer.xml -Djava.security.egd=file:///dev/urandom -classpath /opt/runner/lib/*:/opt/import/lib/* runner.Application --config /opt/import/config/import.simu.properties --workflow import --inputDir /data/etl-simu/in"
PROD_RUN="cd /opt/import/import/current; java -Dlog4j.configurationFile=/opt/import/config/logging/log4j2_Importer.xml -Djava.security.egd=file:///dev/urandom -classpath /opt/runner/lib/*:/opt/import/lib/* runner.Application --config /opt/import/config/import.prod.properties --workflow import --inputDir /data/etl-prod/in"
SIMU_PATH="/data/etl-simu/in"
PROD_PATH="/data/etl-prod/in"
MODE=$1
if [ "${MODE}" = SIMU_PATH ]; then
#execute SIMU_RUN
else
#execute PROD_RUN
fi
exit ${EXIT}
【问题讨论】:
-
见BashFAQ #50,这正是这个问题的重点(并给出了与下面格伦杰克曼的正确答案相同的建议)。
-
...在阅读链接的副本时,我强烈建议忽略已接受的答案(如其 cmets 和 BashFAQ #48 中所述,它给出的建议对安全性和正确性均有害)。
-
嗨,查尔斯,我仍然在 glenn 的答案中遇到错误,因为它是无效模式。我不知道为什么这个问题被关闭了,因为它看起来并不重复
-
原因是相同的潜在错误具有相同的潜在解决方案集,即使表现形式不同。你读过 BashFAQ #50 链接了吗?
-
...要清楚,您的问题是将命令放入变量而不是参数化的原因是 这是您所犯的错误。您在向我们展示的代码中没有犯任何关于参数化的错误,您只是向我们展示了试图将代码存储为数据的代码;因此,您会被标记为问题的重复,其中错误是将代码存储为数据(而不是通过使用函数将代码存储为代码)。
标签: java bash shell command-line