Bir sayı aralığı döndüren standart bir unix programı var mı


22

Ben modası geçmiş bir ders kitabından kabuk yazmayı öğreniyorum ve bana sanki boşluklarla sınırlandırılmış bir sayı dizisi döndüren bir programa sahip olmak gerçekten yararlı olacak gibi görünüyor.

$ range 10 20
10 11 12 13 14 15 16 17 18 19 20

Sonra bir kabuk betiği yapıyorsanız,

for i in `range 10 20`; do some stuff with numbers in that range;done

böyle bir şey var mı, yoksa kendim mi yazmam gerekiyor?


"unix" derken, gerçekten Linux mu demek istiyorsun? Yoksa diğer sistemlere taşınabilirlik ile gerçekten ilgileniyor musunuz (Solaris, BSD, ...)?
glenn jackman,

2
s / aralığı / seq - değiştirin rangeile seqsizin örnekte. varsayılan ayırıcı boşluk olan seq -s " " 10 20
newline'dir

@naxa Eğer forIFS'yi farklı bir şekilde ayarlamadıysanız, boşluklar mı yoksa yeni satırlar mı olduğunu fark edin;
slhck

1
Bu soru "standart unix programının" OP için ne anlama geldiğini tanımlamalıdır.
David Rivers,

1
@DavidRivers'in daha önce de söylediği gibi, başlıkta ve odağınızın Linux dağıtımlarında olduğu sorusunu belirtmelisiniz. Kabul ettiğiniz cevap, standart bir Unix programı olmayan bir araç olduğunu göstermektedir. seqPOSIX tarafından belirtilmeyen bazı Unix'ler eksik .
jlliagre,

Yanıtlar:


79

seq coreutils'in bir parçasıdır.

for i in $( seq 1 2 11 ) ; do echo $i ; done

Çıktı:

1
3
5
7
9
11

Yalnızca 2 argüman verirseniz seq, artış 1'dir:

$ seq 4 9
4
5
6
7
8
9

2
sed-sAyırıcıyı ayarlamak veya -wgenişliği belirlemek gibi hoş seçeneklere de sahiptir . Ve bir artış sağlayabilirsiniz: seq -w -s ", " 0 5 20sonuçlar 00, 05, 10, 15, 20 .
scai

2
@scai demek istedin seq?
Carlos Campderrós

@ CarlosCampderrós Elbette, ne yazık ki yorumumu artık düzenleyemiyorum.
scai

3
seq 10 20eklemeye değer basit bir örnek de olabilir;)
Der Hochstapler

@scai bu harika, bugün yeni bir şey öğrendim :) dürüst olmak gerekirse, bunu ayrı, daha ayrıntılı bir cevap olarak eklemelisin!
Tim Groeneveld

33

Bash yeterli olur mu?

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

Brace genişlemesi ile birçok şey yapabilirsiniz . Bash 4 aynı zamanda yastıklı aralıkları da destekler, örn {01..20}.

Bash unutmayın olmayan bir standart Unix yardımcı taşınabilir kabul olup. Her ne kadar çoğu modern Linux'ta yüklü olduğunu rahatlıkla varsayabilseniz de, bunu her tür Unix benzeri makinede çalıştırmayı planladığınız bir komut dosyasında kullanmayın.


13
@ Maksim: Bu küme ayracı genişletmesini de tercih etsem de, bunun için tipik bir Un * x aracı var (çok az iş yapıyor ama bunu iyi yapıyor) seq. Kullanım sizin örnekte gibidir: seq -s " " 10 20. -sVarsayılan değerler ile ayrılmaktadır, çünkü parametre gereklidir \n.
mpy

Evet, Bash, ne kadar kesin yorumladığınıza bağlı olarak "standart" değildir. Sadece kullanımı daha kolay buluyorum ve fazladan bir arama gerektirmiyor.
slhck

1
@mpy, bunun seqbir GNU yardımcı programı olduğunu ve bu nedenle "standart bir unix programı" olmadığını unutmayın
glenn jackman

5
@glennjackman developer.apple.com/library/Mac/documentation/Darwin/Reference/… ... ' a göre ... "seq komutu ilk önce Bell Labs'ten Plan 9'da ortaya çıktı. "Bu komut, aynı adı Bell Labs’tan ve GNU çekirdek araçlarından gelen Plan 9’daki komutuna dayandırıyordu.
200_success

Ayrıca yapabileceğinizi for i in {001..010}; ... ; doneve sayının 3 hane olarak sıfırlanacağını unutmayın .
VolatileDream

9

Tamamen taşınabilir bir şey istiyorsanız (yani, POSIX tarafından belirtilmeyen belirli bash uzantılarına veya komutlarına dayanmaz)

awk 'BEGIN {for(i=10;i<=20;i++) printf "%d ",i; print}'

1
Eklemene /dev/nullya da buna < /dev/nullgerek yok mu?
Scott,

1
@Scott Hayır, bu gerekli değildir. POSIX standardı ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ) şunları belirtir:If the awk program contains no actions and no patterns, but is otherwise a valid awk program, standard input and any file operands shall not be read and awk shall exit with a return status of zero.
jlliagre

6

10.7'den önce seqMac OS X'te yoktu , ancak jotBSD mirası nedeniyle.

jot -- print sequential or random data

...

HISTORY
    The jot utility first appeared in 4.2BSD

Örnek:

$ jot - 1 3
1
2
3

2

Bir fordöngü kullanın

for ((i = 10; i <= 20; ++i)); do
    printf '%d\n' "$i"
done

2

Kullanabilirsin seqya da yoksa, kendin yazabilirsin:

#!/bin/bash
[ $# -ge 1 ] || { echo "Usage: seq Number [ Number ]" 1>&2 ; exit 1; }
[ $# -eq 1 ] && { [ $1 -gt 1 ] && ./seq $(($1 - 1)) ; echo $1 ; }
[ $# -eq 2 ] && { [ $(($2 - $1)) -gt 0 ] && ./seq $1 $(($2 - 1)) ; echo $2 ; }

Kullanımı:

$ ./seq 3
1
2
3

Veya:

$ ./seq 3 7
3
4
5
6
7

1

Burada eksiksizlik adına Unix'in bazı eski sürümleriyle (perl kurulu olduğu sürece) çalışacak bir şey var. Pek de şık değil.

for I in $(perl -e 'print join("\n", 1..10)'); do something with $I; done
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.