Nikolaos Paschos Asked: 2019-03-21 02:48:54 +0800 CST2019-03-21 02:48:54 +0800 CST 2019-03-21 02:48:54 +0800 CST Bash:为什么这个大括号表达式会这样工作? 772 这是一个 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 bash brace-expansion 1 个回答 Voted Best Answer Kusalananda 2019-03-21T03:54:49+08:002019-03-21T03:54:49+08:00 从bash手册(我强调): 序列表达式采用 形式{x..y[..incr]},其中x和y是整数或单个字符,而incr是可选增量,是整数。当提供整数时,表达式会扩展到 和 之间的每个数字x,y包括 和 。提供的整数可以加上前缀0以强制每个术语具有相同的宽度。当其中一个 x或y以零开头时,shell 会尝试强制所有生成的术语包含相同数量的数字,必要时补零。 提供字符时,表达式将按字典顺序扩展为每个字符,介于x和y,包括在内,使用默认的 C 语言环境。 请注意,两者x和y必须是同一类型。当提供增量时,它被用作每个术语之间的差异。默认增量为 1 或 -1(视情况而定)。 使用字母作为范围的大括号扩展允许bash. 因此,您看到的是 ASCII 表之间G和a中的字符(默认增量为 1,因为值在表中按该顺序出现)。 在标准 ASCII 表中的最后一个大写字符 ( Z) 和第一个小写字符 ( ) 之间a,有字符 [ \ ] ^ _ ` 按照这个顺序。 您不会进入\输出,因为 shell 会将转义的空格字符视为文字空格。另请注意,由于输出了未引用的反引号,这可能会导致意外的代码执行,正如Stéphane在 2015 年发给邮件列表的消息中所指出的那样。bug-bash 然而,我不太清楚手册中提到的“类型”是什么,但我的猜测是你不能使用字母和数字,如{1..z}(确实没有扩展)。
从
bash
手册(我强调):使用字母作为范围的大括号扩展允许
bash
. 因此,您看到的是 ASCII 表之间G
和a
中的字符(默认增量为 1,因为值在表中按该顺序出现)。在标准 ASCII 表中的最后一个大写字符 (
Z
) 和第一个小写字符 ( ) 之间a
,有字符按照这个顺序。
您不会进入
\
输出,因为 shell 会将转义的空格字符视为文字空格。另请注意,由于输出了未引用的反引号,这可能会导致意外的代码执行,正如Stéphane在 2015 年发给邮件列表的消息中所指出的那样。bug-bash
然而,我不太清楚手册中提到的“类型”是什么,但我的猜测是你不能使用字母和数字,如
{1..z}
(确实没有扩展)。