出于大多数历史原因,bash是语法和编程范例的杂烩,这会使它变得笨拙,有时使他们沮丧。语言。其中之一是支撑扩展。
括号扩展有两种基本类型:
- 列表花括号可以包含逗号分隔的任意字符串列表(包括重复项和空字符串)。例如
{a,b,c,,pp,cg,pp,}
将扩展为a b c pp cg pp
(注意空字符串周围的空格)。 - 序列括号可以包含以分隔的序列终点
..
。可选地,..
可以跟随另一个,然后是步长。序列端点可以是整数或字符。该序列将根据哪个端点更大而自动上升或下降。例如:{0..15}
将扩展到0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
将扩展到-10 -9 -8 -7 -6 -5
{3..-6..2}
将扩展到3 1 -1 -3 -5
{a..f}
将扩展到a b c d e f
{Z..P..3}
将扩展到Z W T Q
除此之外,序列括号和列表括号可能与列表括号一起存在:
{a,b,{f..k},p}
将扩展到a b f g h i j k p
{a,{b,c}}
将扩展到a b c
花括号在两侧各以非空白字符串扩展。例如:
c{a,o,ha,}t
将扩展到cat cot chat ct
这对于串联在一起的多个大括号也适用:
{ab,fg}{1..3}
将扩展到ab1 ab2 ab3 fg1 fg2 fg3
这会变得非常复杂。例如:
{A..C}{x,{ab,fg}{1..3},y,}
将扩展到Ax Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
但是,如果扩展之间存在空格,则它们只是作为单独的扩展进行扩展。例如:
{a..c} {1..5}
将扩展到a b c 1 2 3 4 5
注意如何始终保持顺序。
如上所述,挑战的条目将扩展bash大括号扩展。尤其是:
bash
不允许通过(或执行类似扩展的其他Shell)进行评估- 序列花括号将始终为数字到数字,小写字母到小写字母或大写字母到大写字母,并且不混合。数字将是32位有符号范围内的整数。如果给出,可选步长将始终为正整数。 (请注意,bash也将扩展
{A..z}
,但这对于本挑战可能会被忽略) - 列表花括号中的单个项目将始终仅由大小写字母数字字符(包括空字符串)组成
- 列表括号可以包含其他括号扩展的任意嵌套
- 括号可以连接任意次。这将受到您语言记忆的限制,因此可以预期的是,理论上您可以进行任意数量的串联,但是如果/当您的内存用完时,这不会对您不利。
上面文本中的示例用作测试用例。概括起来,每行输入对应于同一行输出,它们分别是:
输入项
{0..15}
{-10..-5}
{3..-6..2}
{a..f}
{Z..P..3}
{a,b,{f..k},p}
{a,{b,c}}
c{a,o,ha,}t
{ab,fg}{1..3}
{A..C}{x,{ab,fg}{1..3},y,}
{a..c} {1..5}
{a{0..100..10},200}r
输出量
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-10 -9 -8 -7 -6 -5
3 1 -1 -3 -5
a b c d e f
Z W T Q
a b f g h i j k p
a b c
cat cot chat ct
ab1 ab2 ab3 fg1 fg2 fg3
Ax Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
a b c 1 2 3 4 5
a0r a10r a20r a30r a40r a50r a60r a70r a80r a90r a100r 200r
3
我调查了一下,由于所有极端情况,简直很难解析:-(
—
Neil