GNU/Linux >> Belajar Linux >  >> Linux

Menjaga Anda di Loop – Contoh Bash Untuk, Sementara, Sampai Loop

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

  1. Untuk putaran
  2. Sementara loop
  3. 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.


Linux
  1. Panduan Bash For Loop dan Contohnya

  2. Skrip Linux:3 cara untuk while loop di Bash

  3. 12 Contoh Bash For Loop untuk Scripting Shell Linux Anda

  1. Contoh Bash For Loop dan While Loop

  2. Tertangkap Dalam Lingkaran? Awk While, Do While, For Loop, Break, Continue, Exit Contoh

  3. Contoh Bash untuk loop

  1. Bash sementara Loop

  2. Bash Untuk Loop

  3. Kiat Pro:Untuk, Sementara, dan Hingga Perulangan