Bagaimana cara menghasilkan rentang dengan langkah n di bash? (menghasilkan urutan angka dengan kenaikan)


143

Cara untuk mengulangi rentang bash adalah

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

Apa yang akan menjadi sintaks untuk mengulangi urutan dengan langkah? Katakanlah, saya hanya ingin mendapatkan angka genap dalam contoh di atas.


Angka genap, kalikan dengan 2.: P
Joey Robert

perkalian agak jelek, saya harus mengatakan
SilentGhost

2
@ Luar Biasa saya tidak akan begitu yakin. OS X masih dilengkapi dengan 3.2, misalnya. Saya akan mengatakan loop C-style harus diterima.
Eli Korvigo

Jawaban:


195

saya akan melakukan

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

(meskipun tentu saja seq 0 2 10akan menghasilkan output yang sama sendiri).

Catatan yang seqmemungkinkan angka floating-point (misalnya, seq .5 .25 3.5) tetapi ekspansi brace bash hanya memungkinkan bilangan bulat.


4
Saya akan menebak bahwa downvote itu karena jawaban Anda bersifat umum untuk 'sh', dan tidak khusus untuk 'bash'. Pendekatan Bash murni {begin end step} berkinerja sedikit lebih baik. Metode 'seq' yang lebih lama berguna pada sistem memori yang lebih lama atau lebih kecil seperti busybox. Saya melakukan upvote jawaban Anda dan TheBonsai. :)
Scott Prive

6
Lebih suka $ (...) untuk mengutip kembali. Backquotes tidak bersarang dengan sehat.
Mahakuasa

seq 1000000 1000010 hanya mengapung, sebenarnya - tidak ada cara untuk membuatnya bilangan bulat! Ekspansi brace bekerja.
hmijail meratapi orang-orang yang mengundurkan diri

112

Ekspansi brace Bash 4 memiliki fitur langkah:

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

Tidak masalah jika Bash 2/3 (C-style untuk loop, lihat jawaban di atas) atau Bash 4, saya lebih suka apapun daripada perintah 'seq'.


1
dan btw, tahukah Anda jika bash4 default pada OS utama apa pun?
SilentGhost

3
Bash4 masih bukan arus utama, tidak. Kenapa tidak seq? Baiklah, katakan saja dengan kata-kata bot di saluran IRC #bash: "seq (1) adalah perintah eksternal yang sangat tidak standar yang digunakan untuk menghitung sampai 10 dalam howtos Linux yang konyol."
TheBonsai

Pemahaman saya adalah bahwa seq adalah bagian dari coreutils. apa yang tidak standar tentang itu? argumen? terima kasih atas bantuan Anda.
SilentGhost

4
Argumen-argumen ini mungkin atau mungkin tidak diperhitungkan untuk Anda: * ada cukup sistem tanpa GNU coreutils (tetapi Bash terpasang) * Anda membuat proses eksternal yang tidak diperlukan * Anda mengandalkan gagasan bahwa semua 'seq' melakukan apa yang 'seq' Anda lakukan * itu tidak distandarisasi oleh ISO
TheBonsai

3
@becko Jika langkah disimpan dalam variabel i, maka Anda tidak dapat melakukannya for {0..10..${i}}.. gagal.
Nehal J Wani

72

Bash Murni, tanpa proses tambahan:

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

10
+1 Karena langkahnya dapat diganti oleh variabel juga.
Nehal J Wani

1
Saya pikir inilah yang sebenarnya diinginkan oleh kebanyakan orang - cara sederhana untuk melakukan perulangan dengan nilai langkah yang ditentukan. Kedengarannya lebih sederhana daripada semua jawaban berbasis seq, dan merupakan sintaks yang lebih jelas daripada ekspansi brash Bash4, dan sepertinya itu akan memungkinkan untuk variabel (saya belum mencobanya, tapi sintaks pasti menyarankan itu).
tobylaroni

Berfungsi di Bash 3, tidak seperti jawaban @ TheBonsai.
srcerer

Ia bahkan menyelesaikan variabel, ((i = "$ first"; i <= "$ last"; i + = "$ step")). Tidak begitu mudah dengan kurung kurawal dan seq.
Blaa_Thor

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

seq adalah perintah Linux. Ini tidak akan tersedia di Mac OS X atau FreeBSD.
Dereckson

5
FWIW seq tersedia di standar OS X Mavericks 10.9.1
Mark Setchell

Saya sudah mencoba beberapa sintax lain, tetapi itu adalah satu-satunya yang berfungsi untuk saya pada CentOS kecil. @z - telah menyelamatkan hari saya: 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.