Fish shell 中变量扩展意外缺失。

3

这是2.1.0版本。

$ set a foo
$ set b bar
$ echo $a_$b

$ echo {$a}_$b
foo_bar

为什么第一个 "echo" 没有输出任何内容?我本来期望看到 "bar"。
1个回答

5

首先要明白的是下划线在标识符中是有效的,因此被扩展的变量不是$a而是$a_

现在$a_未设置,这意味着它被视为零个条目的列表。未引用的变量替换通过为列表中的每个元素单独扩展参数来工作,例如:

> set a 1 2 3
> echo {$a}_x
1_x 2_x 3_x

在原问题中,$a_为空。该参数将分别对列表中的每个元素进行扩展,由于列表为空,因此结果为空。这就是为什么它没有输出任何内容的原因。
双引号扩展的工作方式不同:列表条目通过空格连接,然后进行扩展。
> set a 1 2 3
> echo "$a"_x
1 2 3_x

这样就可以更符合您的预期:

> set a foo
> set b bar
> echo "$a"_"$b"
foo_bar
> echo "$a_"$b
bar

谢谢,解释得非常好。我来自bash,那里的东西只是字符串(除非你在它们上面使用大量语法)。我必须习惯fish变量是列表,除非用字符串保护。 - glenn jackman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接