我正在尝试将字符串与 .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
类似的解决方法,我个人觉得不够安全,不建议推荐,所以跳过那些。