我有
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)
这说:
- 创建一个名为“MY_VAR”的 shell 变量,并将其设置为 $() 中的任何内容,即...
- grep 使用
-P
perl 正则表达式 并-o
仅返回此模式 '...' 的匹配,即 (?<=SA_PASSWORD=).*
这意味着匹配任何字符任意次数,但前提是第一个字符.*
之前的字符是“SA_PASSWORD=”哦,并且不要将它们包含在匹配中。(?<=)
.
答案3
如果变量的名称并不重要,则可以source
。
source tests/.makefile_test_env
echo $SA_PASSWORD # Prints Password1!
警告:对不受信任的文件执行源操作是危险的。您正在执行一个 shell 脚本,并且该脚本可以执行您自己可以执行的任何操作。