Saya mencoba menjalankan dua urutan dalam loop yang sama di shell saya seperti di bawah ini:
#!/bin/bash
for i in (1..15) and (20..25) ;
do
echo $i
......
.....other process
done
ada ide bagaimana saya bisa mencapai ini?
command-line
bash
sh
HISI
sumber
sumber
Jawaban:
Anda hanya perlu ekspansi penjepit untuk itu
Kami dapat meneruskan daftar ke
for
( ).for i in x y z; do stuff "$i"; done
Jadi di sini, kawat gigi
{
}
mendapatkan shell untuk memperluas urutan Anda ke dalam daftar. Anda hanya perlu menempatkan spasi di antara mereka, karena shell membagi daftar argumen pada mereka.sumber
echo
nomortouch
file, mereka bisa melakukannyatouch {1..15}.txt {20..25}.txt
, tidak perlu loop di sini. Tapi tentu saja jika beberapa tindakan pada nomor yang sama - OK, itu bisa menggunakan perulangan.Atau kita dapat menggunakan
seq
( mencetak urutan angka ), berikut adalah dua contoh yang setara:Jika ini adalah skrip, untuk tugas berulang, Anda dapat menggunakan fungsi:
sumber
Jawaban Zanna dan jawaban pa4080 sama-sama baik dan saya mungkin akan pergi dengan salah satu dari mereka dalam banyak situasi. Mungkin tidak perlu dikatakan lagi, tetapi demi kelengkapan, saya tetap akan mengatakannya: Anda dapat memuat setiap nilai ke dalam array dan kemudian mengulangi array. Sebagai contoh:
sumber
Looping tanpa loop
Jawaban Zanna benar-benar benar dan cocok untuk bash, tetapi kita dapat meningkatkannya lebih banyak lagi tanpa menggunakan loop.
Perilaku
printf
adalah sedemikian rupa sehingga jika jumlahARGUMENTS
lebih besar dari kontrol format'FORMAT STRING'
, makaprintf
akan membagi semuaARGUMENTS
menjadi potongan yang sama dan terus menyesuaikan mereka ke string format berulang-ulang sampai kehabisanARGUMENTS
daftar.Jika kita berjuang untuk portabilitas, kita dapat memanfaatkan
printf "%d\n" $(seq 1 15) $(seq 20 25)
sebagai gantinyaMari kita lanjutkan ini dan lebih menyenangkan. Katakanlah kita ingin melakukan tindakan daripada hanya mencetak angka. Untuk membuat file dari urutan angka itu, kita bisa dengan mudah melakukannya
touch {1..15}.txt {20..25}.txt
. Bagaimana jika kita ingin banyak hal terjadi? Kita juga bisa melakukan sesuatu seperti ini:Atau jika kita ingin menjadikannya gaya sekolah lama:
Alternatif yang portable tapi verbose
Jika kita ingin membuat solusi skrip yang bekerja dengan shell yang tidak memiliki ekspansi brace (yang
{1..15} {20..25}
bergantung pada), kita dapat menulis loop sementara sederhana:Tentu saja solusi ini lebih bertele-tele, beberapa hal bisa dipersingkat, tetapi berhasil. Diuji dengan
ksh
,dash
,mksh
, dan tentu sajabash
.Bash C-style loop
Tetapi jika kita ingin membuat loop bash-spesifik (untuk alasan apa pun, mungkin tidak hanya mencetak tetapi juga melakukan sesuatu dengan angka-angka itu), kita juga dapat melakukan ini (pada dasarnya versi C-loop dari solusi portabel):
Atau dalam format yang lebih mudah dibaca:
Perbandingan kinerja dari berbagai pendekatan pengulangan
Alternatif non-shell
Hanya karena kita dapat inilah solusi Python
Atau dengan sedikit cangkang:
sumber
touch $(printf "%d\n" {1..15} {20..25})
:-)bash
Anda bahkan tidak perlu di$()
sana, hanyatouch {1..15}.txt {20..25}.txt
:) Tapi tentu saja kita bisa menggunakanprintf "%d\n
{1..15} {20..25} `denganxargs
jika kita ingin melakukan lebih dari sekadartouch
file. Ada banyak cara untuk melakukan sesuatu dan itu membuat penulisan skrip jadi sangat menyenangkan!