bashシェルから属性(env)ファイルの属性値をbashシェルのvarにロードするには?

bashシェルから属性(env)ファイルの属性値をbashシェルのvarにロードするには?

私は持っています

SA_PASSWORD=Password1!

ファイルでテスト/.makefile_test_env。私のbashシェルの変数に「Password1!」値を取得したい。私はこれを試しました

$ 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」というシェル変数を作成し、$()の内容に設定します。つまり...
  2. grepは-Pperl正規表現を使用し、-o「...」パターンに一致するもののみを返します。つまり、
  3. (?<=SA_PASSWORD=).*これは文字を複数回一致させることを意味します。ただし、最初の文字の前の文字が.*「SA_PASSWORD =」で一致に含まれていない場合にのみ適用されます。(?<=).

答え3

変数名が重要でない場合は問題ありませんsource

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

警告する:信頼できないファイルに対してソース操作を実行するのは危険です。あなたはシェルスクリプトを実行しており、スクリプトはあなたが自分でできることをすべて行うことができます。

関連情報