Çoğunlukla tarihsel nedenlerden ötürü, bash, sözdizimi ve programlama paradigmalarının oldukça yoğun bir podgesidir - bu, garip ve bazen golf oynamak için sinir bozucu olabilir. Diller. Bunlardan biri küme ayracı genişlemesidir .
İki temel küme ayracı genişletme türü vardır:
- Liste parantezleri, rastgele dizelerin virgülle ayrılmış listelerini içerebilir (kopyalar ve boş dize dahil). Örneğin
{a,b,c,,pp,cg,pp,}
, genişlera b c pp cg pp
(boş dizelerin etrafındaki boşluklara dikkat edin). - Dizi parantezleri, ile ayrılmış dizi uç noktaları içerebilir
..
. İsteğe bağlı olarak başka..
bir adım ve ardından bir adım boyutu gelebilir. Dizi bitiş noktaları, tamsayılar veya karakterler olabilir. Sekans, hangi uç noktasının daha büyük olduğuna göre otomatik olarak yükselir veya alçalır. Örneğin:{0..15}
genişleyecek0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
genişleyecek-10 -9 -8 -7 -6 -5
{3..-6..2}
genişleyecek3 1 -1 -3 -5
{a..f}
genişleyeceka b c d e f
{Z..P..3}
genişleyecekZ W T Q
Bunun ötesinde, liste ayraçları ile sıra ve liste ayraçları bulunabilir:
{a,b,{f..k},p}
genişleyeceka b f g h i j k p
{a,{b,c}}
genişleyeceka b c
Parantezler, her iki tarafında da boşluk olmayan dizelerle genişler. Örneğin:
c{a,o,ha,}t
genişleyecekcat cot chat ct
Bu, birlikte bir araya getirilmiş birden çok parantez için de geçerlidir:
{ab,fg}{1..3}
genişleyecekab1 ab2 ab3 fg1 fg2 fg3
Bu oldukça karmaşık olabilir. Örneğin:
{A..C}{x,{ab,fg}{1..3},y,}
genişleyecekAx 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
Ancak, açılımlar arasında boşluk varsa, sadece ayrı açılımlar olarak genişlerler. Örneğin:
{a..c} {1..5}
genişleyeceka b c 1 2 3 4 5
Siparişin her zaman nasıl korunduğuna dikkat edin.
Bu meydan okuma için girişler yukarıda açıklandığı gibi bas parantez genişletmelerini genişletecektir. Özellikle:
- tarafından değerlendirmeye
bash
(veya benzer genişleme yapan diğer mermilere) izin verilmez - sıralı parantezler her zaman sayıdan sayıya, küçük harfe küçük harfe veya büyük harfe büyük harfe dönüşmez. Sayılar, 32 bit işaretli aralıkta tamsayılar olacaktır. Verilirse, isteğe bağlı adım boyutu her zaman pozitif bir tamsayı olacaktır. (Bash'in de genişleyeceğini unutmayın
{A..z}
, ancak bu meydan okuma için bu göz ardı edilebilir) - liste parantezlerindeki tek tek öğeler her zaman yalnızca büyük ve küçük harf alfasayısal karakterlerden oluşur (boş dize dahil)
- liste parantezleri diğer küme ayracı genişletmelerinin keyfi yuvalarını içerebilir
- kaşlı ayraçlar keyfi sayıda kez birleştirilebilir. Bu, dilinizin hafızasıyla sınırlandırılacaktır, bu nedenle beklenti, teorik olarak rastgele sayıda birleştirmeler yapabilmenizdir, ancak size karşı saymayacak bir belleğiniz varsa / bittiğinde.
Yukarıdaki metindeki örnekler test senaryoları olarak kullanılmıştır. Özetle, her girdi satırı aynı çıktı satırına karşılık gelir, bunlar:
Giriş
{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
Çıktı
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