用于解析 .env 文件的 Bash 命令包含等号 (=) 值

问题描述 投票:0回答:4

我有一个

.env
文件,

# Some variables
USERNAME=user1
PASSWORD=

# Other variables
URL=https://example.com
TOKEN=muDm8qJ6mqM__YX024dk1RXluPnwd-3mxyt1LwLoI4ISiVPA==

目的

我的目的是创建一行bash命令以

<name> <value>
格式打印每个非空变量,这将

  1. 为每个变量打印一行,名称和之间用[空格] 值;
  2. 忽略评论;
  3. 忽略没有值的变量;

预期产量

预期输出是,

USERNAME user1
URL https://example.com
TOKEN muDm8qJ6mqM__YX024dk1RXluPnwd-3mxyt1LwLoI4ISiVPA==

当前解决方案

我目前的解决方案如下,

grep -v '^#' .env | grep -v '^[[:space:]]*$' | grep -v '=$' | sed 's/=/ /' | while read -r line; do echo $line; done

实际产量

USERNAME user1
URL https://example.com

它只打印出前两行,最后一行的问题是由

TOKEN
值中的等号(=)引起的。

需要帮助

任何人都可以帮我纠正命令吗?如果有更简单的方法来实现目标也欢迎。

bash sed grep environment-variables
4个回答
1
投票

使用

sed

$ sed '/=\</!d;s/=/ /' input_file
USERNAME user1
URL https://example.com
TOKEN muDm8qJ6mqM__YX024dk1RXluPnwd-3mxyt1LwLoI4ISiVPA==

删除与有效变量不匹配的行,即在

=
之后没有输入,这也将匹配空白行,对于您的示例数据,带有注释的行,因为该行上没有有效变量。最后,将第一次出现的
=
等号字符替换为空格。


1
投票
处理任何环境变量文件的唯一方法是实际解释它。下面描述了打印变量列表的各种方法。

各种“环境文件”通常被设计为由 POSIX shell 运行来评估所有变量。这使得在分配给变量时可以调用外部命令、执行计算等。

仅当您信任输入文件时才执行此操作。

可以通过使用下面的脚本解析文件来执行任何命令。

您可以获取文件(内置命令.

):

. .env

获取数据后,您可以评估变量。如果您知道要打印的所有变量,请使用它(对于变量
USERNAME

PASSWORD

. .env

for var_name in USERNAME PASSWORD
do
    printf "%s %s\n" "$var_name" "${!var_name}"
done

如果要打印所有显式指定的变量,请使用以下方法:
. .env

grep '^\w+=' | sed 's/=//' | while read var_name
do
    printf "%s %s\n" "$var_name" "${!var_name}"
done

但是这个解决方案也并不完美,因为
.env
文件可以使用与

var_name=value

 不同的结构来分配变量。使用 
set
 命令打印所有变量。
这会打印出
绝对所有

变量。 (实际上,环境文件应该从系统环境变量继承它的变量,所以有很多。)

. .env printenv | sed 's/=/ /'

sed
用于去掉等号。

谨防一些危险的变量值。

变量甚至可以包含换行符、退格符和其他控制字符。

还有许多不同的实用程序用于以允许将变量加载回 shell 的方式打印变量。例如:


declare -p

typeset -p

 — 打印出 
declare
 命令来声明所有当前设置的 
shell
 变量
export -p

— 相同,但是对于

环境

 变量(这可能就是你想要的)
set

— 打印出所有 shell 变量


如果文件仅包含注释和简单的

1
投票
行,字符串中没有

#

 字符,则可以使用此管道:
sed 's/#.*//' | fgrep = | sed 's/=/ /'

或者如果你不想输出空变量,可以使用这个:
sed 's/#.*//' | grep =. | sed 's/=/ /'

我会做这样的事情

0
投票
bash -c 'source <(cat .env | grep USERNAME); echo $USERNAME'

为什么?

短篇

    熟悉的命令易于理解
  • 通过
  • source
  • 重用解析逻辑,而不是实现一个
  • 为什么不呢?

键重复

    尽管用函数包装可以缓解这种情况
    • 也许您更喜欢使用
    sed
  • 或其他解析方法
  • 也许由于某种原因你不想生成一个新的 shell 
    bash -c
  • 灵感来自
https://unix.stackexchange.com/a/176874

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.