bash - 扩展包含环境变量引用的字符串

bash - expanding a string containing environment variable references

我正在使用 bash shell。我想从 env 中提取一些值并将这些值分配给一个变量。我还需要在 = 符号处拆分它。使用 bash 的最佳实用程序是什么?

我基本上需要用这些值创建一个字符串,同时去掉分隔符:

echo -e "This is my $KEY and my profile is $PROFILE"
This is my Ru2cXJbgWQ0wdtKBGbS5/nVQvGo and my profile is foobar

结果:

-bash-4.1$ echo -e "This is my $KEY"
This is my
-bash-4.1$ env | grep KEY
KEY=Ru2cXJbgWQ0wdtKBGbS5/nVQvGo

示例:

$ env | grep KEY
KEY=Ru2cXJbgWQ0wdtKBGbS5/nVQvGo

$ env | grep DEFAULT_PROFILE
DEFAULT_PROFILE=foobar

当 Bash 启动时,它继承的每个环境变量都会自动创建为 shell 变量 aka 参数。来自 Bash 手册页:

When a program is invoked it is given an array of strings called the environment. This is a list of name-value pairs, of the form name=value.

The shell provides several ways to manipulate the environment. On invocation, the shell scans its own environment and creates a parameter for each name found, automatically marking it for export to child processes.

如果KEYPROFILE是环境变量,运行

echo -e "This is my $KEY and my profile is $PROFILE"

应该打印所需的响应。

来补充,这表明Bash自动将环境变量表示为shell变量[1]:

简而言之:env | grep KEY returns KEY=Ru2cXJbgWQ0wdtKBGbS5/nVQvGo 并不一定意味着存在名为 KEY 的环境变量.

可以想象,您得到的 grep 匹配项是 other 环境变量的匹配项' values甚至多行变量的最后一行name谢谢,chepner

虽然环境变量和值通常单行,但它们不一定是。一个例子是Bash自己导出函数的能力,其通常多行定义被导出为特别命名的值环境变量。


验证给定的 (Bash) shell 变量确实基于 环境变量,使用:

declare -p KEY  # example with variable name 'KEY'

如果 KEY 确实是一个环境变量,您将看到(使用您的示例):

declare -x KEY="Ru2cXJbgWQ0wdtKBGbS5/nVQvGo"

注意 -x,它表示一个 exported 变量,它与 environment 变量同义。

对比:

  • 如果 KEY 是一个 shell 变量而不是环境变量,则 -x 将失踪了。

  • 如果 KEY 既不是 shell 变量也不是环境变量,您将看到一条错误消息。


anubhava,在对该问题的评论中,演示了一种独立于 shell 的方法来测试是否定义了环境变量:

printenv KEY  # prints value of env. var. 'KEY'

退出代码 0 告诉您变量存在(即使它没有值)。

请注意 printenv 是一个不符合 POSIX 的外部实用程序;但是,它确实带有 Linux 和 BSD/OSX.


[1] 注意使用Bash自己的字符串展开(双引号字符串的插值),展开的不只是environment变量引用,还有shell-only变量引用。 GNU 实用程序 envsubst,相比之下,允许您限制对环境变量的扩展。