我无法-
在shell中的变量中使用。有没有一种方法可以使用它,因为我有一个脚本依赖于这样的命名变量:
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
第一个抛出给定的错误,第二个工作正常。
我无法-
在shell中的变量中使用。有没有一种方法可以使用它,因为我有一个脚本依赖于这样的命名变量:
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
第一个抛出给定的错误,第二个工作正常。
Answers:
我从未见过允许-
使用变量名的Bourne风格的shell 。仅支持ASCII字母(无论哪种情况)_
和数字,并且第一个字符不能为数字。
如果您的程序需要的环境变量与shell限制不匹配,请与该env
程序一起启动它。
env 'strange-name=some value' myprogram
请注意,某些外壳程序(例如,现代dash,mksh,zsh)会从环境中删除其名称不喜欢的变量。(Shellshock使人们对环境变量名称更加谨慎,因此限制可能会随着时间的流逝而变得更加严格,而不是更加宽松。)因此,如果您需要将名称中包含特殊字符的变量传递给程序,请直接将其传递,中间没有外壳(env 'strange-name=some value' sh -c'…; myprogram'
可能会也可能不会工作)。
env
在哪种操作系统上使用了哪种实现,您的评论将非常有用。)
env
from coreutils
,sh
from dash
:的所有更新的Ubuntu Yakkety可以env 'with-dashes=value' bash -c 'env | fgrep dashes'
工作,但不env 'with-dashes=value' sh -c 'env | fgrep dashes'
打印任何内容。也就是说,env
它本身很好,但是Dash似乎专门阻止了这些变量。因此,如果所讨论的程序是通过具有典型#!/bin/sh
头文件的外壳包装程序启动的,则没有明显的方法来传递此类变量。解决方法示例
env
需要此变量名的程序的调用站点附近使用,而在两者之间没有外壳。Dash并不是唯一一个删除其名称不喜欢的变量的方法。
在Bash中是不可能的。
在以下手册页的“ 定义”部分中bash
:
名称仅由字母数字字符和下划线组成的单词,以字母字符或下划线开头。也称为标识符。
在以下手册页的“ 参数”部分中bash
:
参数是存储值的实体。它可以是名称,数字或特殊参数下面列出的特殊字符之一。变量是用名称表示的参数。
您可以使用间接引用访问带连字符的变量。
$ env 'my-hyphenated-variable=hello' /bin/bash
$ name='my-hyphenated-variable'
$ echo ${!name}
hello
大多数外壳程序仅支持将az,AZ,0-9和_作为变量名。阅读此页面的第二项。
您可以玩env和sed。
例如,我需要读取此变量“ ELASTICSEARCH_CLUSTER-NODES”。
env命令输出以下内容:
~ $ env
ELASTICSEARCH_CLUSTER-NODES=elasticsearch:9200
JAVA_ALPINE_VERSION=8.212.04-r0
HOSTNAME=17eb9e7fec4c
...
因此要提取变量:
ESHOST=`env | sed -n 's/ELASTICSEARCH_CLUSTER-NODES=\(.*\)/\1/p'`
我相信bash变量仅允许使用字母,数字和下划线。在许多编程语言中都是这种情况(javascript是一个例外)。
我建议您不要让脚本取决于变量名称的那些类型。
实际上,您应该尝试以可以将变量名替换为其他名称的方式进行编程,并且这没有什么区别。通常,变量名称应描述变量包含的内容。这使得调试变得更加容易。如果不适合您,则为下一个试图找出代码的开发人员。