Bash'ta adım n ile bir aralık nasıl üretilir? (artımlı bir sayı dizisi oluşturun)


143

Bash'ta bir aralıkta yineleme yolu

for i in {0..10}; do echo $i; done

Sekans üzerinde bir adımla yineleme sözdizimi ne olur? Diyelim ki, yukarıdaki örnekte sadece çift sayı almak istiyorum.


Çift sayılarla, i'yi 2 ile çarpın.: P
Joey Robert

çarpma oldukça çirkin, söylemeliyim
SilentGhost

2
@Omnifarious O kadar emin olmazdım. OS X hala 3.2 ile geliyor. C tarzı döngünün kabul edilmesi gerektiğini söyleyebilirim.
Eli Korvigo

Yanıtlar:


195

ben yapardım

for i in `seq 0 2 10`; do echo $i; done

(tabii ki seq 0 2 10aynı çıktıyı kendi başına üretecektir).

Not seqverir kayan noktalı sayılar (örneğin seq .5 .25 3.5) ama bash en ayracı genişleme yalnızca tamsayılar verir.


4
Düşüşün cevabınızın 'sh' için genel olması ve 'bash' için spesifik olmaması nedeniyle bir tahminde bulunacağım. Saf Bash yaklaşımı {başlangıç ​​adımı} biraz daha iyi performans gösterir. Daha eski 'seq' yöntemi, meşgul kutusu gibi eski veya daha küçük bellek sistemlerinde kullanışlıdır. Hem senin hem de TheBonsai'nin cevabını onayladım. :)
Scott Prive

6
Backquotes için $ (...) tercih et. Geriye dönük tırnaklar sağlıklı bir şekilde iç içe geçmez.
şeye kadir

seq 1000000 1000010 sadece yüzer, aslında - tamsayı yapmanın bir yolu yoktur! Destek genişletme işleri.
hmijail resignees

112

Bash 4'ün destek genişletmesinin bir adım özelliği vardır:

for {0..10..2}; do
  ..
done

Bash 2/3 (döngü için C stili, yukarıdaki cevaplara bakın) veya Bash 4 olursa olsun, 'seq' komutuna göre her şeyi tercih ederim.


1
ve btw, bash4'ün herhangi bir büyük işletim sisteminde varsayılan olup olmadığını biliyor musunuz?
SilentGhost

3
Bash4 hala ana akım değil, hayır. Neden seq olmasın? Diyelim ki #cash IRC kanalındaki bot'un sözleriyle şunu söyleyelim: "seq (1) aptal Linux howtosunda 10'a kadar saymak için kullanılan oldukça standart dışı bir harici komuttur."
TheBonsai

benim anlayışım seq coreutils bir parçası olduğunu. bununla ilgili standart olmayan nedir? argümanlar? yardımınız için teşekkürler.
SilentGhost

4
Bu argümanlar sizin için geçerli olabilir veya olmayabilir: * GNU çekirdeği olmayan (ancak Bash yüklü) yeterli sistem var * gereksiz bir harici işlem yaratıyorsunuz * 'seq'inizin' seq'inizin yaptığı şeyi yapması fikrine güveniyorsunuz * ISO tarafından standartlaştırılmamış
TheBonsai

3
@becko Adım değişkente saklanırsa, iyapamazsınız for {0..10..${i}}.. başarısız olur.
Nehal J Wani

72

Ekstra bir işlem olmadan Pure Bash:

for (( COUNTER=0; COUNTER<=10; COUNTER+=2 )); do
    echo $COUNTER
done

10
+1 Çünkü adım bir değişkenle de değiştirilebilir.
Nehal J Wani

1
Sanırım çoğu insanın istediği şey bu - öngörülen adım değerine sahip bir döngü yapmanın basit bir yolu. Tüm seq tabanlı cevaplardan daha basit geliyor ve Bash4 brace genişlemesinden daha açık bir sözdizimidir ve değişkenlere izin verecek gibi görünüyor (bunu denemedim, ancak sözdizimi kesinlikle bunu önerir).
tobylaroni

@ TheBonsai'nin cevabından farklı olarak Bash 3'te çalışır.
srcerer

Değişkeni bile çözer, ((i = "$ first"; i <= "$ last"; i + = "$ step")). Kıvırcık parantez ve seq ile o kadar kolay değil.
Blaa_Thor

20
#!/bin/bash
for i in $(seq 1 2 10)
do
   echo "skip by 2 value $i"
done

seq bir Linux komutudur. Bu, Mac OS X veya FreeBSD'de kullanılamaz.
Dereckson

5
FWIW seq standart OS X Mavericks 10.9.1
Mark Setchell'de

Başka bir sintaks denedim, ama bu sadece benim için küçük bir CentOS üzerinde çalışıyor. @z - günümü kurtardı: D
m3nda

3
> seq 4
1
2
3
4

> seq 2 5
2
3
4
5

> seq 4 2 12
4
6
8
10
12

> seq -w 4 2 12
04
06
08
10
12

> seq -s, 4 2 12
4,6,8,10,12
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.