我正在尝试将字符串与 .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
。我缺少什么?
谢谢。
问题是您的
.env
文件具有 Windows (CRLF) 行结尾,而不是默认的 Unix 样式 LF。这意味着您最终会在导出的变量和附加文本之间出现回车符。我强烈建议通过配置 vscode 使用正确的操作系统结尾来从源头解决问题 - 但是如果您必须使用 Windows 结尾,那么我建议获取该文件并标记其所有变量以供导出,如下所示:
grep
而不是尝试使用和操作文件xargs
。添加@steeldriver的细心回答......
由于您使用的是 Bash shell,因此您可以使用其 RegEx 匹配功能及其使用 C 样式转义序列的参数扩展来
$'\r'
匹配\r
行末尾的 ,同时在 shell 循环中读取文件行,如下所示:...你可以在你的代码片段中使用这样的:
所有 shell 内置且纯 Bash。
请注意,与@steeldriver的答案不同,我的答案有一个警告,即在变量赋值字符串周围包含(在导出的变量的值中)引号(如果有任何类似的
var1="string"
或)var2='string'
,尽管您可以通过扩展参数替换模式来解决这个问题"${line//$'\r'}"
到"${line//[$'\r'|\"|\']}"
,您需要记住,这种补救措施也会删除变量赋值字符串内的那些引号,而不仅仅是它周围的引号......可能还有其他eval
类似的解决方法,我个人觉得不够安全,建议跳过这些。