【问题标题】:Parse .env file with bash [duplicate]用 bash 解析 .env 文件 [重复]
【发布时间】:2018-10-10 22:49:46
【问题描述】:

我有 .env 文件,我正在尝试从中解析值。

我跑了这个

cat .env | grep PORT=

我明白了

PORT=3333

如何获取特定键的值?

【问题讨论】:

标签: linux bash shell environment-variables


【解决方案1】:

使用eval解析赋值行,后面的变量值可以用$代替:

eval "$(grep ^PORT= .env)"
echo $PORT

【讨论】:

  • 这将改变整个脚本的环境,可能包括PATH之类的东西。
  • 我不想改变任何东西,我只想从中阅读。
  • grep ^PORT= .env > tmp.sh, source tmp.sh
  • 此时您可以eval "$(grep ^PORT= .env)" 并避免使用临时文件。这样,您还可以避免使用硬编码的临时文件名而遭受符号链接攻击的漏洞。 (当然,仍然容易受到PORT=$(rm -rf ~) 配置文件的攻击)。
  • eval $foo 不如 eval "$foo" 可靠(因为它不是抑制字符串拆分的句法元素,它的参数被字符串拆分、全局扩展,然后重新组合成一个字符串)——命令替换的反引号被认为是遗留语法(难以嵌套,反斜杠在它们内部的含义与在外部的含义不同)。请考虑我在上面评论中建议的语法。
【解决方案2】:
cat env | grep PORT= | cut -d '=' -f2

【讨论】:

  • grep PORT= <envgrep PORT= env 比使用单独的 cat 进程更有效。
  • 你是对的!有几种方法可以做到这一点。我介绍了其中之一。
  • 当然——但如果您要介绍一种方式,为什么不尝试优化最佳实践方法呢?在这种特定情况下,额外的cat 并不重要,但是让人们进入是一个坏习惯——cat foo | wc -c 阻止wc 只能使用seek()tell() 来获取大小其输入文件在恒定时间 f/e 中的影响,因此在其他命令中的影响可能要大得多。 (类似地,GNU sort 可以并行处理大型输入文件……但仅在从可查找文件读取时,而不是从 FIFO 读取,FIFO 只能从前到后读取一次)。
【解决方案3】:

假设您的输入如下所示:

$ cat test.txt
Port=2020
Email=me@myserver.com
Version=2.02

然后就可以了:

awk -F'=' '/^Version/ { print $2}'  test.txt

输出

2.02

【讨论】:

  • 好答案。您实际上可能会显示使用此命令所需的命令替换 (version=$(awk ...))。
猜你喜欢
  • 2019-07-07
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多