Pernyataan perulangan digunakan untuk memaksa program mengeksekusi pernyataan berulang kali. Pernyataan yang dieksekusi disebut badan perulangan.
Loop dijalankan hingga nilai ekspresi pengontrol adalah 0. Ekspresi pengontrol dapat berupa tipe data skalar apa pun.
Bahasa shell juga menyediakan beberapa pernyataan iterasi atau perulangan. Dalam artikel ini mari kita tinjau pernyataan perulangan yang disediakan bash menggunakan beberapa contoh.
Bash mendukung tiga jenis pernyataan perulangan berikut
- Untuk putaran
- Sementara loop
- Sampai berulang
Artikel ini adalah bagian dari seri Tutorial Bash yang sedang berlangsung.
Loop dapat bersarang. Seperti bahasa pemrograman lainnya, bash juga mendukung pernyataan break untuk keluar dari loop saat ini, dan pernyataan continue untuk melanjutkan iterasi berikutnya dari pernyataan loop.
Bash For Loop – Metode Pertama
For loop biasanya digunakan ketika jumlah iterasi diketahui sebelum memasuki bash loop. Bash mendukung dua jenis for loop. Bentuk pertama dari bash for loop adalah:
for varname in list do commands ##Body of the loop done
Dalam sintaks di atas:
- for, in, do, dan done adalah kata kunci
- Daftar adalah daftar yang berisi daftar barang
- varname adalah nama variabel Bash apa pun.
Dalam formulir ini, pernyataan for mengeksekusi perintah yang terlampir di badan, sekali untuk setiap item dalam daftar. Item saat ini dari daftar akan disimpan dalam variabel "varname" setiap kali melalui loop. Varname ini dapat diproses di dalam tubuh loop. Daftar ini dapat berupa variabel yang berisi beberapa kata yang dipisahkan oleh spasi. Jika list tidak ada dalam pernyataan for, maka dibutuhkan parameter posisi yang diteruskan ke shell.
Contoh Bash For Loop 1. Buka zip semua file Zip
Contoh berikut menemukan daftar file yang cocok dengan “*.zip*” di direktori root, dan membuat direktori baru di lokasi yang sama tempat file zip berada, dan mengekstrak konten file zip.
# cat zip_unzip.sh #! /bin/bash # Find files which has .zip for file in `find /root -name "*.zip*" -type f` do # Skip the extension .zip dirname=`echo ${file} | awk -F'.' '{print $1}'` # Create the directory mkdir $dirname # Copy the zip file cp ${file} ${dirname} cd $dirname # Unzip the zip file from newly created directory unzip ${dirname}/$(echo ${file##/*/}) done
- Dalam contoh ini, perintah find mengembalikan daftar file, dari mana setiap file akan diproses melalui loop.
- Untuk setiap item, ini membuat direktori dengan nama file zip, dan menyalin file zip ke direktori yang baru dibuat dan mengekstrak file zip dari sana.
- Pernyataan echo, echo ${file##/*/} hanya memberi Anda nama file, bukan path.
# ./zip_unzip.sh Archive: /root/test2/test2.zip extracting: t1/p extracting: t1/q extracting: t1/r extracting: t1/s extracting: t1/t extracting: t1/u extracting: t1/v Archive: /root/test1/test1.zip extracting: t/a extracting: t/b extracting: t/c extracting: t/d extracting: t/e
Mirip dengan loop Bash, Awk juga menyediakan loop for dan while seperti yang telah kita bahas di artikel Awk While dan For Loop.
Bash For Loop – Metode Kedua
Bentuk perulangan for yang kedua mirip dengan perulangan for dalam bahasa pemrograman ‘C’, yang memiliki tiga ekspresi (inisialisasi, kondisi, dan pembaruan).
for (( expr1; expr2; expr3 )) do commands done
- Dalam bash di atas untuk sintaks perintah, sebelum iterasi pertama, expr1 dievaluasi. Ini biasanya digunakan untuk menginisialisasi variabel untuk loop.
- Semua pernyataan antara do dan done dieksekusi berulang kali hingga nilai expr2 bernilai TRUE.
- Setelah setiap iterasi dari loop, expr3 dievaluasi. Ini biasanya digunakan untuk menambah penghitung loop.
Contoh berikut menghasilkan jumlah n angka acak.
Contoh Bash 2. Hasilkan n angka acak
$ cat random.sh #! /bin/bash echo -e "How many random numbers you want to generate" read max for (( start = 1; start <= $max; start++ )) do echo -e $RANDOM done $ ./random.sh How many random numbers you want to generate 5 6119 27200 1998 12097 9181
Dalam cuplikan kode di atas, loop for menghasilkan angka acak sebanyak-banyaknya. RANDOM adalah fungsi bash internal yang mengembalikan bilangan bulat acak pada setiap pemanggilan.
Bash Sementara Loop
Pernyataan iterasi lain yang ditawarkan oleh bahasa pemrograman shell adalah pernyataan while.
Syntax: while expression do commands done
Dalam sintaks loop while di atas:
- sementara, lakukan, selesai adalah kata kunci
- Ekspresi adalah ekspresi apa pun yang mengembalikan nilai skalar
- Pernyataan while menyebabkan blok kode dieksekusi sementara ekspresi kondisional yang diberikan bernilai benar.
Bash While Contoh 3. Tulis konten ke dalam file
Contoh berikut membaca data dari stdout dan menulis ke dalam file.
$ cat writefile.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to create" read file while read line do echo $line >> $file done $ sh writefile.sh Enter absolute path of the file name you want to create /tmp/a while for until $ cat /tmp/a while for until
Contoh di atas, membaca nama file dari pengguna, dan membaca baris data dari stdin dan menambahkan setiap baris ke nama file yang diberikan. Saat EOF masuk, pembacaan akan gagal, sehingga loop berakhir di sana.
Jika Anda menulis banyak skrip bash, Anda dapat menggunakan editor Vim sebagai Bash IDE menggunakan plugin dukungan bash Vim seperti yang telah kita bahas sebelumnya.
Bash While Contoh 4. Membaca isi file
Pada contoh sebelumnya, ia membaca data dari stdout dan menulisnya ke dalam file. Dalam contoh ini, ia membaca file
konten dan menulisnya ke dalam stdout.
$ cat read.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to read" read file exec <$file # redirects stdin to a file while read line do echo $line done $ ./read.sh Enter absolute path of the file name you want to read /tmp/a while for until
Dalam contoh ini, itu membuat nama file untuk dibaca, dan menggunakan exec itu mengarahkan stdin ke file. Sejak saat itu, semua stdin berasal dari file itu, bukan dari keyboard. perintah read membaca baris dari stdin, jadi saat loop membaca stdin, hingga EOF terjadi.
Bash Sampai Loop
Pernyataan hingga sangat mirip dalam sintaks dan fungsi dengan pernyataan while. Satu-satunya perbedaan nyata antara keduanya adalah bahwa pernyataan hingga mengeksekusi blok kodenya sementara ekspresi kondisionalnya salah, dan pernyataan while mengeksekusi blok kodenya saat ekspresi kondisionalnya benar.
syntax: until expression do commands #body of the loop done
Dalam sintaks bash sampai di atas:
di mana sampai, lakukan, selesai adalah kata kunci
ekspresi ekspresi kondisional apa pun
Bash Hingga Contoh 5. Pantau file log
Contoh ini memonitor ukuran file log, setelah ukuran file log mencapai 2000 byte, dibutuhkan salinan file log tersebut.
$ cat monitor.sh file=/tmp/logfile until [ $(ls -l $file | awk '{print $5}') -gt 2000 ] do echo "Sleeping for next 5 seconds" sleep 5 done date=`date +%s` cp $file "$file-"$date.bak $ ./monitor.sh Sleeping for next 5 seconds Sleeping for next 5 seconds $ ls -l /tmp/logfile* -rw-r--r-- 1 sss sss 2010 Jun 24 12:29 logfile -rw-r--r-- 1 sss sss 2005 Jun 24 16:09 logfile-1277474574.bak
Pernyataan hingga terus mengeksekusi tubuh loop, hingga kondisinya menjadi benar. Dalam kondisi contoh ini ukuran file lebih besar dari 2000 byte, sehingga file akan disalin setelah mencapai 2000 byte.
Juga, pastikan untuk merujuk ke contoh Bash Array kami sebelumnya.
Bash Sampai Contoh 6. Menunggu Mesin muncul
Contoh ini digunakan untuk menunggu sampai mesin muncul sebelum melakukan ssh ke mesin itu. Pernyataan hingga loop berakhir hanya ketika ping memberikan tanggapan.
$ cat mac_wait.sh #! /bin/bash read -p "Enter IP Address:" ipadd echo $ipadd until ping -c 1 $ipadd do sleep 60; done ssh $ipadd $./mac_wait.sh Enter IP Address:192.143.2.10 PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data. --- 192.143.2.10 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data. 64 bytes from 192.143.2.10: icmp_seq=1 ttl=64 time=0.059 ms --- 192.143.2.10 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms The authenticity of host '192.143.2.10 (192.143.2.10)' can't be established. Are you sure you want to continue connecting (yes/no)? yes
Sampai loop cukup berguna di baris perintah, sebagai cara menunggu peristiwa tertentu terjadi.