【问题标题】:Bash - Parse environment variables in bash functionBash - 在 bash 函数中解析环境变量
【发布时间】:2021-01-25 20:33:27
【问题描述】:

我有一个 bash 函数,可以从 .env 文件中检索环境变量。

在我的.env 文件中,我有以下变量

USER=luis
IMAGE_NAME=application
IMAGE_VERSION=latest
IMAGE_TAG=${USER}/${IMAGE_NAME}:${IMAGE_VERSION}

在我的 bash 脚本中,我有我的 env 函数

function dotenv::get() {
  variable=$(grep ^"${1}"= "$(pwd)/.env" | xargs)
  IFS="=" read -ra variable <<< "${variable}"

  echo "${variable[1]}"
}

当我执行dotenv::get IMAGE_TAG.

预期结果:luis/application:latest

当前结果:${USER}/${IMAGE_NAME}:${IMAGE_VERSION}

我知道我的功能不完整,但我不确定实现目标的下一步是什么。

【问题讨论】:

  • | xargs xargs 在那里做什么?
  • : 在函数名中合法吗?我会感到惊讶。
  • @KamilCuk 可能是从多行获取输入到单行。
  • @BenjaminW。我正在关注 Google Shell 样式指南google.github.io/styleguide/shellguide.html#s7.1-function-names
  • 啊,确实。在 Bash 中似乎没问题,在 POSIX 中允许。

标签: bash environment-variables


【解决方案1】:

该文件看起来想要保留 shell-ish 语法。如果是这样,就source吧:

. ./.env
echo "$IMAGE_TAG"

dotenv::get() { 
    . ./.env;
    echo "${!1}"
}

如果这不是你的意图,那么从一个文件中实现一个完整的变量解析器,并用 ${...} 变量替换已设置的变量。

【讨论】:

  • 获取文件也会设置变量,这可能不是用户想要的。您可以(在子进程中)获取文件并执行echo,但随后只会扩展导出的变量。我害怕得到 OP 要求的功能,除了做一个eval 之外别无他法,它的所有危险(当然,如果你获取文件,就会存在)。
  • 当然,dotenv::get() { ( . ./.env; echo "${!1}" ); }
  • 这将仅扩展那些在.env 中定义的未导出 变量,而不是那些在调用此函数的进程中定义的变量。这可能是也可能不是 OP 想要的。请参阅我对这个问题的评论,其中谈到了这个问题。
  • 我不明白。不,所有变量都可用,. 在当前 shell 中执行。不,( ) 执行的子shell 共享所有变量,而不仅仅是导出的变量。而且,.env 文件是自给自足的 - 它不引用任何未在其内部设置的变量。
  • Is this the semantics of the (....) construct 是的,属于“子shell”,$(...) 以及反引号和管道也是如此。让我们看看posix shell execution environment 看看A subshell environment shall be created as a duplicate of the shell environment 的东西。
【解决方案2】:

您仍然缺少两件事:解释您的变量赋值,以及解释您查询的变量的内容:

. $(pwd)/.env  # source the environment file so that variables are assigned

function dotenv::get() {
  variable=$(grep ^"${1}"= "$(pwd)/.env" | xargs)
  IFS="=" read -ra variable <<< "${variable}"

  eval X=${variable[1]}  # interpret the expression containing variables
  echo $X
}

dotenv::get IMAGE_TAG

【讨论】:

  • 最好先使用declare "X=${variable[1]}",然后使用不带引号的扩展eval
  • 使用间接运算符${!variablename}不是更好吗?
  • 表达式被.解释的时候,为什么还要解释?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 2022-11-24
  • 2016-03-14
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多