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

时间:2016-04-28 20:15:34

标签: bash shell unix environment-variables

我正在使用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

2 个答案:

答案 0 :(得分:4)

补充Anthony Geoghegan's helpful answer,表示Bash 自动表示环境变量为 shell 变量 [1]

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

可以想象您获得的grep匹配是其他环境变量'的匹配,甚至是多行变量 name 的最后一行。 谢谢,chepner

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

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

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

如果KEY确实是一个环境变量,你会看到(使用你的例子):

declare -x KEY="Ru2cXJbgWQ0wdtKBGbS5/nVQvGo"

请注意-x,表示导出的变量,该变量与 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 - 变量引用。相比之下, GNU 实用程序envsubst允许您将扩展限制为环境变量。

答案 1 :(得分:2)

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

  

当调用程序时,会给出一个称为环境的字符串数组。这是一个名称 - 值对列表,其格式为name=value

     

shell提供了几种操作环境的方法。在调用时,shell会扫描自己的环境,并为找到的每个名称创建一个参数,自动将其标记为导出到子进程。

如果KEYPROFILE是环境变量,则运行

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

应打印所需的回复。