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.
如果KEY
和PROFILE
是环境变量,运行
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
,相比之下,允许您限制对环境变量的扩展。
我正在使用 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.
如果KEY
和PROFILE
是环境变量,运行
echo -e "This is my $KEY and my profile is $PROFILE"
应该打印所需的响应。
来补充
简而言之: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
,相比之下,允许您限制对环境变量的扩展。