在 bash shell 中,如何将属性 (env) 文件中的属性值加载到 bash shell 中的 var 中?

在 bash shell 中,如何将属性 (env) 文件中的属性值加载到 bash shell 中的 var 中?

我有

SA_PASSWORD=Password1!

在文件中,tests/.makefile_test_env。我想获取值“Password1!”到我的 bash shell 上的一个变量中。我试过这个

$ MY_VAR=$(grep SA_PASSWORD tests/.makefile_test_env | xargs)

不幸的是,这返回

$ echo $MY_VAR
SA_PASSWORD=Password1!

如何过滤掉“SA_PASSWORD=”部分?

答案1

你可以通过命令来做到这一点cut;但请记住,将密码保留在脚本中可能不是一个好主意。

[ekaj@headdesk ~]$ cat vars
SA_PASSWORD=Password1!
[ekaj@headdesk ~]$ cat setvar.sh
#!/bin/bash
echo "MY_VAR is currently set to: $MY_VAR"
MY_VAR=$(grep SA_PASSWORD ./vars | cut -d'=' -f 2-)
echo "MY_VAR is currently set to: $MY_VAR"
[ekaj@headdesk ~]$
[ekaj@headdesk ~]$ ./setvar.sh
MY_VAR is currently set to:
MY_VAR is currently set to: Password1!
[ekaj@headdesk ~]$

打印-f 2-第一个之后的所有字段=,如果您的密码中恰好有等号,这可能会很方便。

答案2

您几乎已经拥有它,请尝试使用扩展正则表达式和后视模式并且仅(而且您也不需要管道xargs):

MY_VAR=$(grep -Po '(?<=SA_PASSWORD=).*' tests/.makefile_test_env)

这说:

  1. 创建一个名为“MY_VAR”的 shell 变量,并将其设置为 $()​​ 中的任何内容,即...
  2. grep 使用-Pperl 正则表达式 并-o仅返回此模式 '...' 的匹配,即
  3. (?<=SA_PASSWORD=).*这意味着匹配任何字符任意次数,但前提是第一个字符.*之前的字符是“SA_PASSWORD=”哦,并且不要将它们包含在匹配中。(?<=).

答案3

如果变量的名称并不重要,则可以source

source tests/.makefile_test_env
echo $SA_PASSWORD # Prints Password1!

警告:对不受信任的文件执行源操作是危险的。您正在执行一个 shell 脚本,并且该脚本可以执行您自己可以执行的任何操作。

相关内容