shell 变量名称可以包含连字符或破折号 (-) 吗?

xyz*_*xyz 52 shell environment-variables

我无法-在 shell 中的变量中使用。有没有办法使用它,因为我有一个依赖于这样命名变量的脚本:

$export a-b=c
-bash: export: `a-b=c': not a valid identifier

$export a_b=c
Run Code Online (Sandbox Code Playgroud)

第一个抛出给定的错误,第二个工作正常。

Gil*_*il' 66

我从来没有遇到过允许-在变量名中使用的 Bourne 风格的 shell 。仅支持 ASCII 字母(无论哪种情况)_和数字,且第一个字符不得为数字。

如果您的程序需要的环境变量与 shell 限制不匹配,请使用该env程序启动它。

env 'strange-name=some value' myprogram
Run Code Online (Sandbox Code Playgroud)

请注意,某些 shell(例如现代 dash、 mksh 、 zsh )会从环境中删除它们不喜欢名称的变量。(Shellshock导致人们对环境变量名称更加谨慎,因此随着时间的推移,限制可能会变得更严格,而不是更宽松。)所以如果您需要将名称包含特殊字符的变量传递给程序,请直接传递,中间没有外壳(env 'strange-name=some value' sh -c'…; myprogram'可能会也可能不会)。

  • @JesseGlick 是的。(如果你定义了“不工作”,你的评论会很有用:用什么数据?效果是什么而不是预期的效果?如果你说你在什么操作系统上使用了 `env` 的哪个实现。) (5认同)

Lek*_*eyn 17

这在 Bash 中是不可能的。

从手册页中的定义部分bash

名称 仅由字母数字字符和下划线组成并以字母字符或下划线开头的单词。也称为标识符。

从手册页的参数部分bash

参数是存储值的实体。它可以是名称、数字或特殊参数下列出的特殊字符之一。变量是由名称表示的参数。

  • +1 再次证明手册页的有用性 (2认同)
  • 我知道旧帖子,但是,我想指出,对于新手来说,手册页可能非常神秘。我仍然有时需要寻找更好的解释/示例。如果有人说这从来没有发生在他们身上,那他们就是在撒谎。 (2认同)
  • @TCZ8 唯一告诉我他们认为手册页“神秘”的人是同一类人,他们不阅读错误消息,只是浏览所有内容,直接跳过他们需要阅读的内容。 (2认同)

小智 16

您可以使用间接引用访问带连字符的变量。

$ env 'my-hyphenated-variable=hello' /bin/bash
$ name='my-hyphenated-variable'
$ echo ${!name}
hello
Run Code Online (Sandbox Code Playgroud)

  • 此行为已在较新版本的 bash 中禁用。请参阅 http://stackoverflow.com/questions/36989263/why-cant-environment-variables-with-dashes-be-accessed-in-bash-4-1-2 对情况进行全面分析。 (11认同)

小智 7

如果您的脚本依赖于变量名称包含连字符,则这是一个编程错误。如果因为您经常使用的工具使变量名称包含连字符而方便您,那么您可能需要了解更多不同的工具。

您是否尝试过使用tr将连字符转换为下划线?

hyphenated_name="a-b"
unhyphenated_name=$(echo $hyphenated_name | tr '-' '_')
declare -x $unhyphenated_name="some value"
Run Code Online (Sandbox Code Playgroud)

Bash 确实允许“-”出现在函数名称中。我一直这样做。例如:

function foo-bar() {
   echo "$@"
}
Run Code Online (Sandbox Code Playgroud)