首页 > 解决方案 > 在 shell 脚本中取消引用参数扩展的环境变量

问题描述

我正在尝试使用参数扩展取消引用环境变量的值$@,但它似乎不起作用。

我需要调用带有某些参数的 shell 脚本。参数列表包含环境变量,并且环境变量应该出现在要执行 shell 脚本的位置。我事先不知道命令列表,所以我使用$@. 但是,该脚本无法取消引用环境变量的值。

可以按如下方式完成解释我的问题的最小设置。

FROM alpine:3.10

ENV MY_VAR=production

WORKDIR /app

COPY run.sh .

ENTRYPOINT [ "sh", "run.sh" ]
#!/bin/sh

echo "Value of MY_VAR is" $MY_VAR

echo "Begin"

$@

echo "Done"

我可以使用docker build . -t env-test. 当我使用 运行它时docker run env-test:latest 'echo $MY_VAR',我得到以下输出。

Value of MY_VAR is production
Begin
$MY_VAR
Done

虽然我期望的输出是:

Value of MY_VAR is production
Begin
production
Done

旁注:实际上,我正在尝试使用如下 compose 文件运行它:

version: '3'

services:
  run:
    image: env-test:latest
    command: echo $$MY_VAR

但它再次给了我类似的结果。

标签: bashshelldockerdocker-composedocker-command

解决方案


扩展该eval方法,这是一个简单的 bash 脚本,它将使用 eval 将字符串评估为一系列 bash 命令:

#!/usr/bin/env bash
echo program args:  $@
eval $@

但要小心,eval伴随着危险:

https://medium.com/dot-debug/the-perils-of-bash-eval-cc5f9e309cae


推荐阅读