Bash:为什么这个 Brace 表达式会这样工作?

Nik*_*hos 6 bash brace-expansion

这是一个 bash 4 特定问题。我对 bash Brace Expressions 有点熟悉,我已经阅读了手册,但我不明白它实际上是如何工作的。

我想它与ASCII 表有关,但我不习惯搜索 bash 源代码来确认它,所以我的问题是:

为什么这会echo {G..a}扩展到

G H I J K L M N O P Q R S T U V W X Y Z [  ] ^ _ ` a
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

bash手册(我的重点):

序列表达式采用的形式是{x..y[..incr]},其中xy是整数或单个字符,而incr是可选增量,是整数。当提供整数时,表达式扩展到x和之间的每个数字y,包括。提供的整数可能以 为前缀,0以强制每个术语具有相同的宽度。当 xy以零开头时,shell 会尝试强制所有生成的术语包含相同数量的数字,并在必要时填充零。 当字符被提供,所述表达扩展到每个字符字典顺序之间xy,包括,使用默认的 C 语言环境。 请注意,xy必须是同一类型。当提供增量时,它被用作每个术语之间的差异。默认增量为 1 或 -1(视情况而定)。

以字母为范围的大括号扩展允许bash. 因此,您看到的是ASCII 表之间Ga中的字符(默认值为 1,因为值在表中按该顺序出现)。

在标准 ASCII 表中的最后一个大写字符 ( Z) 和第一个小写字符 ( )之间a,有

[ \ ] ^ _ `
Run Code Online (Sandbox Code Playgroud)

按照这个顺序。

您不会进入\您的输出,因为 shell 会将转义的空格字符视为文字空间。另请注意,由于输出了未加引号的反引号,这可能会导致意外的代码执行,正如Stéphanebug-bash在 2015 年发送给邮件列表的消息中所指出的那样

然而,我不太清楚手册中将什么称为“类型”,但我的猜测是您不能使用字母和数字,如{1..z}(确实没有扩展)。

  • 另见 https://lists.gnu.org/archive/html/bug-bash/2015-07/msg00135.html (3认同)