Bash:为什么这个大括号表达式会这样工作?

Bash:为什么这个大括号表达式会这样工作?

这是 bash 4 的特定问题。我对 bash 大括号表达式有些熟悉,并且我已经阅读了手动的但我不明白它实际上是如何工作的。

我想这与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

答案1

bash手册中(我强调):

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

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

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

[ \ ] ^ _ `

按这个顺序。

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

然而,我不太清楚手册中所说的“类型”,但我的猜测是你不能使用字母和数字,如{1..z}(它确实不扩展)。

相关内容