获取环境变量后连接字符串

获取环境变量后连接字符串

我正在尝试将字符串与 .env 文件中的变量连接起来。我的 .env 是这样的:

API_URL=http://localhost:3030
NODE_ENV=development

这是我的代码:

[ ! -f .env ] || export $(grep -v '^#' .env | xargs)

URL="${API_URL}/health"

echo $URL

我期望它能打印出来http://localhost:3030/health。但它打印出来了/healthlocalhost:3030。我遗漏了什么?

谢谢。

答案1

问题是您的.env文件有 Windows (CRLF) 行尾,而不是默认的 Unix 样式 LF。这意味着导出的变量和附加的文本之间最终会出现回车符。

ID强烈建议通过配置 vscode 以使用操作系统的正确结尾来从源头解决问题 - 但是如果你必须使用 Windows 结尾,那么我建议采购文件并标记其所有变量以供导出,如下所示:

if [[ -r .env ]]; then
  set -o allexport
  . <(sed 's/\r$//' .env)
  set +o allexport
fi

grep而不是尝试使用和来操作文件xargs

答案2

添加到@steeldriver的贴心回答……

由于您使用的是 Bash shell,因此您可以使用其 RegEx 匹配功能及其参数扩展,使用 C 样式的转义序列来$'\r'匹配\r行尾,同时在 shell 循环中读取文件行,如下所示:

while IFS= read -r line; do
  [[ "$line" =~ ^# ]] || export "${line//$'\r'}"
done <"file"

...您可以在代码片段中使用如下代码:

[ ! -f .env ] || while IFS= read -r line; do [[ "$line" =~ ^# ]] || export "${line//$'\r'}"; done <".env"

所有 shell 内置和纯 Bash。

注意与@steeldriver 的答案不同,我的答案有一个警告,包括(在导出变量的值中),变量赋值字符串周围的引号(如果有)var1="string"var2='string'和,尽管您可以通过将参数替换模式从扩展到来解决这个问题"${line//$'\r'}""${line//[$'\r'|\"|\']}"但您需要记住,这种补救措施将删除变量赋值字符串中的那些引号,而不仅仅是它周围的引号......可能还有其他eval类似的解决方法,我个人觉得不够安全,不建议推荐,所以跳过那些。

相关内容