如何在shell中的变量名中使用(-连字符)?

Nai*_*aik 4 shell

我打算在变量中使用 (hyphen -)test-ing=3.0但我无法打印 value $test-ing。我知道连字符在 shell 上不起作用,有什么可能的方法可以在不更改变量名称的情况下打印变量值?

mur*_*uru 11

假设一个环境变量,因为test-ing它不是一个有效的 shell 变量名,你可以使用printenv

% env foo-bar=baz printenv foo-bar
baz
Run Code Online (Sandbox Code Playgroud)

或 Perl:

% env foo-bar=baz perl -e 'print $ENV{"foo-bar"}'
baz
Run Code Online (Sandbox Code Playgroud)

或其他工具,如 Python 等。

  • 请注意,像 `mksh` 这样的 shell 从环境中删除了无法映射到 shell 变量的变量(例如,尝试使用 `env foo-bar=baz mksh -c 'printenv foo-bar'`)。因此,请自担风险并为那些不*遍历*所有`exec()`链的人做好准备。 (6认同)

Sté*_*las 5

rcshell或派生类 ( es, akanga) 中,变量名中几乎可以使用任何东西。

所有变量也被导出到环境中。

但是,在 Byron Rakitzis 的rcfor Unix克隆(来自es/akanga派生)中,与plan9的端口rc(现在公开可用,因为 plan9 已作为 FLOSS 发布)相反,请注意那些包含a-zA-Z0-9_两个字符之外的字符或两个序列的或更多下划线,在从环境导出/导入时使用编码/解码:

$ rc
; foo-bar = baz
; echo $'foo-bar'
baz
; printenv foo-bar
; env | grep foo
foo__2dbar=baz
Run Code Online (Sandbox Code Playgroud)

在 Byron's 中rc,也不能使用名称为空的变量:

; '' = 1
rc: zero-length variable name
Run Code Online (Sandbox Code Playgroud)

类似1 = foo* = (foo bar)有效的东西,但它们设置的是位置参数,而不是变量。