我无法-
在 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 脚本中通常不是一个好主意。
如果您编辑此内容或提出一个新问题,其中包含您的上下文详细信息以及您想要完成的任务,我们可能会建议一种编写脚本的好方法。