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

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

我无法-在 shell 中使用变量。有没有一种方法可以使用它,因为我有一个依赖于此类命名变量的脚本:

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

$export a_b=c

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

答案1

-我从未遇到过允许输入变量名的Bourne 风格 shell 。仅支持 ASCII 字母(无论大小写)_和数字,并且第一个字符不能是数字。

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

env 'strange-name=some value' myprogram

请注意,某些 shell(例如现代破折号、mksh、zsh)从环境中删除名称不喜欢的变量。 (炮弹休克导致人们对环境变量名称更加谨慎,因此随着时间的推移,限制可能会变得更严格,而不是更宽松。)因此,如果需要将名称包含特殊字符的变量传递给程序,请直接传递,而不需要shell 介于两者之间(env 'strange-name=some value' sh -c'…; myprogram'可能工作也可能不工作)。

答案2

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

$ env 'my-hyphenated-variable=hello' /bin/bash
$ name='my-hyphenated-variable'
$ echo ${!name}
hello

答案3

这在 Bash 中是不可能的。

来自定义手册页中的部分bash

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

来自参数手册页中的部分bash

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

答案4

破折号 ( -) 字符是换行符,不允许作为变量名称的一部分。有很多方法可以用带引号的变量来破解这个问题,但是它的解析确实是有问题的。在 bash 变量名上下文中还有其他具有特殊含义的字符,特别是大括号、圆括号、运算符字符和引号。 (例如{}()=+-&'"以及更多)

我建议您实际上需要找到另一个范例来构建脚本。您可能对其他语言中关于“变量变量名称”的想法有一些保留。这在 shell 脚本中通常不是一个好主意。

如果您编辑此内容或提出一个新问题,其中包含您的上下文详细信息以及您想要完成的任务,我们可能会建议一种编写脚本的好方法。

相关内容