这是 2.1.0 版
$ set a foo
$ set b bar
$ echo $a_$b
$ echo {$a}_$b
foo_bar
Run Code Online (Sandbox Code Playgroud)
为什么第一个“回声”什么都不输出?我本来希望看到“酒吧”
首先要意识到下划线在标识符中是有效的,所以被扩展的变量不是$abut $a_。
现在$a_未设置,这意味着它被视为零条目列表。不带引号的变量替换通过为列表中的每个元素分别扩展参数来工作,例如:
> set a 1 2 3
> echo {$a}_x
1_x 2_x 3_x
Run Code Online (Sandbox Code Playgroud)
在原始问题中,$a_是空的。参数为列表中的每个元素单独展开,它是空的,所以结果什么都没有。这就是它什么都不输出的原因。
双引号扩展的工作方式不同:列表条目由空格连接,然后扩展。
> set a 1 2 3
> echo "$a"_x
1 2 3_x
Run Code Online (Sandbox Code Playgroud)
这可能更像您期望的那样:
> set a foo
> set b bar
> echo "$a"_"$b"
foo_bar
> echo "$a_"$b
bar
Run Code Online (Sandbox Code Playgroud)