很抱歉,因为可能有人问过这个问题,但我无法正确搜索这些特殊字符。
我有以下内容script.sh
:
#!/bin/bash
export c=23;
"$@"
当我用以下方式调用它时:
(export a=231; export b=45; ./script.sh echo "$a, $b, $c")
该变量$c
不会出现在输出中:
231, 45,
如何创建一个直通脚本,向执行的命令添加额外的变量?
再次编辑完整上下文:
用法是我有一个docker容器。 dockerfile 在构建时获取 COMMIT_HASH。然后我想调用java app.jar
(用于容器运行),并且该运行进程应该配置 COMMIT_HASH 变量。
所以在 中Dockerfile
,我现在有这样的东西:
RUN echo "#!/bin/bash \n java -Dapp.info.commit-hash=\"${COMMIT_HASH}\" -jar /app.jar \"\$@\"" > ./entrypoint.sh
...
ENTRYPOINT ["./entrypoint.sh"]
如您所见,使用此设置我无法配置 jar 的参数。但我不知道如何能够在容器外部创建完整的命令并将变量替换到其中。
这就是为什么,理想情况下,我希望有一个脚本可以指定额外的变量,但也可以将变量配置为默认值。
这就是为什么最终脚本(现在不使用 Dockerfile)看起来像这样:
#!/bin/bash
export COMMIT_HASH=a982321bc232d;
"$@"
然后将它们合并在一起:
# read from a .env file or something - these are dynamic values
export PORT=8081;
export FRONTEND_URL=http://example.com;
java -Dapp.info.commit-hash="${COMMIT_HASH}" -Dserver.port="${PORT}" -jar /app.jar --FRONTEND_URL="${FRONTEND_URL}"
答案1
您需要$c
在调用脚本时转义 for 的印记,并在脚本中eval "$@"
进行第二轮变量扩展。
$ cat script.sh
#!/bin/bash
export c=23;
eval "$@"
$ (export a=231; export b=45; bash -x ./script.sh echo "$a, $b, \$c")
+ export c=23
+ c=23
+ eval echo '231, 45, $c'
++ echo 231, 45, 23
231, 45, 23
或者,单引号发送到脚本的代码并让脚本的 shell 展开所有变量:
$ (export a=231; export b=45; bash -x ./script.sh 'echo "$a, $b, $c"')
+ export c=23
+ c=23
+ eval 'echo "$a, $b, $c"'
++ echo '231, 45, 23'
231, 45, 23