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'
可能会也可能不会)。
Lek*_*eyn 17
这在 Bash 中是不可能的。
从手册页中的定义部分bash
:
名称 仅由字母数字字符和下划线组成并以字母字符或下划线开头的单词。也称为标识符。
从手册页的参数部分bash
:
参数是存储值的实体。它可以是名称、数字或特殊参数下列出的特殊字符之一。变量是由名称表示的参数。
小智 16
您可以使用间接引用访问带连字符的变量。
$ env 'my-hyphenated-variable=hello' /bin/bash
$ name='my-hyphenated-variable'
$ echo ${!name}
hello
Run Code Online (Sandbox Code Playgroud)
小智 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)