Bash 像elasticsearch docker entrypoint这样的脚本如何管理具有特殊字符的可变名称

Bash 像elasticsearch docker entrypoint这样的脚本如何管理具有特殊字符的可变名称,bash,sh,Bash,Sh,Elasticsearch只是一个例子,它的容器将node.name或path.repo作为环境变量。当我尝试通过以下方式访问此类变量时: ${path.repo}我得到的是错误替换与以下内容相同: ${path\.repo} “${path\.repo}” 这些变量是如何在docker之外声明的 我想要一个能与任何shell一起工作的解决方案,因为我计划在全球范围内使用它 我试图重载其中一些变量(很简单),然后用if块验证它们的值(我被卡住的地方)。这些不是有效的shell变量名,因此您将

Elasticsearch只是一个例子,它的容器将
node.name
path.repo
作为环境变量。当我尝试通过以下方式访问此类变量时:
${path.repo}
我得到的是
错误替换
与以下内容相同:

  • ${path\.repo}
  • “${path\.repo}”
这些变量是如何在docker之外声明的

我想要一个能与任何shell一起工作的解决方案,因为我计划在全球范围内使用它

我试图重载其中一些变量(很简单),然后用if块验证它们的值(我被卡住的地方)。

这些不是有效的shell变量名,因此您将无法在shell中设置(或访问)它们。其他语言没有这种特殊的限制。例如,在Python中,我可以运行:

>>> import os
>>> # set environment variable path.repo
>>> os.environ['path.repo'] = 'foo'
>>> # access environment variable path.repo in a child process
>>> res = os.spawnvp(os.P_WAIT, 'python', ['python', '-c', 'import os; print(os.environ["path.repo"])'])
foo
我们可以看到环境变量
path.repo
os.spawnvp
生成的子流程中可见


如果仅限于典型的shell,则选项会受到更多约束。您可以使用
env
命令设置如下变量:

env path.repo=foo somecommand ...
要访问shell中的变量,需要解析
env
命令的输出:

env | awk -F= '/path.repo/ {print $2}'

谢谢你的回答,我知道你可以用其他语言来做,但我特别需要它在shell中。所以没有任何解决方案可以访问无效的shell变量名?(带“.”或“-”的变量)请参阅我关于使用
env
命令的更新。awk解决方案是我使用过的解决方案,但使用“export”代替env,使用“cut”代替awk,这在本质上仍然相同,对我的if没有帮助。我想我会把它设置成一个新的变量,然后用它来代替。