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