Ini adalah artikel kedua dari seri yang berfokus pada skrip Gnu Bash. Pada artikel skrip bash pertama, kami baru saja membuat skrip paling sederhana:perintah sederhana, satu demi satu. Kami juga melihat beberapa variabel yang digunakan. Artikel ini akan membahas struktur kontrol bash.
Struktur kontrol
Seperti yang sudah saya katakan di artikel sebelumnya, kemalasan adalah kunci kesuksesan. Jika saya harus menjalankan beberapa perintah, beberapa saat kemudian perintah yang sama dalam urutan yang sama, ketika ketiga kalinya saya akan membuka editor teks dan menempelkan perintah itu untuk menyimpannya sebagai skrip.
Setelah beberapa hari kemudian, skrip itu mulai berkembang, baik dalam ekstensi maupun kompleksitas. Saya memerlukan cara untuk mengontrol alur eksekusi, misalnya:
- jika sesuatu terjadi lakukan sesuatu, atau jika sesuatu tidak terjadi lakukan hal lain;
- sementara sesuatu terjadi, lakukan sesuatu berulang-ulang, atau lakukan sesuatu berulang-ulang;
- atau tergantung pada nilai variabel atau apa yang terjadi, lakukan ini atau itu atau yang lain,
- dll
Inilah yang dimaksudkan untuk struktur kontrol bash (sebenarnya, dalam bash atau bahasa pemrograman lainnya). Tapi pertama-tama, kita perlu tahu tentang:
Status keluar
Dari halaman manual bash:
«Status keluar dari perintah yang dijalankan adalah nilai yang dikembalikan oleh panggilan sistem waitpid atau fungsi yang setara. Status keluar berada di antara 0 dan 255. (…) Status keluar dari nol menunjukkan keberhasilan (atau, sama dengan 'benar'). Status keluar bukan nol menunjukkan kegagalan (atau, sama dengan 'false').(… Sebagai contoh:) Jika sebuah perintah tidak ditemukan, proses anak yang dibuat untuk mengeksekusinya mengembalikan status 127. Jika sebuah perintah ditemukan tetapi tidak dapat dieksekusi, status pengembaliannya adalah 126 ».
tl;dr:status keluar dari 0 berarti benar , kesuksesan; nilai lainnya berarti salah . Penting untuk mempelajari ini karena untuk melakukan keputusan benar/salah berarti memeriksa status keluar dari suatu perintah.
Bash menyimpan status keluar dari perintah yang terakhir dieksekusi di $? variabel.
jika-maka-lain
Ini adalah jika terjadi sesuatu (sesuatu terjadi berarti perintah dengan status keluar dari nol) lakukan sesuatu , atau melakukan hal lain. Sintaksnya adalah:
if command then command1 command2 ... else commandA commandB ... fi
Seperti yang Anda lihat pada tangkapan layar, perintah ini dapat ditulis dalam satu baris, memisahkan setiap perintah dengan titik koma:
if command; then command1; command2;...; else commandA; commandB;...;fi
Bergantung pada kerumitan blok if-then, mungkin lebih mudah untuk membaca atau lebih sulit untuk membaca gaya 'oneliner'.
Bagaimana jika Anda ingin menjalankan beberapa perintah jika terjadi sesuatu, jalankan perintah lain hanya jika sesuatu yang lain terjadi? gunakan kata kunci elif (else if):
if command then command1 command2 ... elif other_command commandA commandB ... else another block of commands fi
Blok if-then-else diakhiri dengan kata kunci fi (jika mundur).
Perbandingan string dan angka
Ingat variabel? sering sesuatu terjadi adalah bahwa tergantung pada nilai variabel kita ingin menjalankan beberapa perintah atau lainnya.
Untuk membandingkan apakah string sama dengan beberapa kata atau angka lebih rendah dari yang lain, kita menggunakan perintah test . Sintaks umumnya adalah:
test expression
Jika ekspresi dihilangkan dianggap salah (status keluar> 0). Jika ekspresi hanya string teks itu benar. Ini bisa jadi rumit, misalnya:
$ test false; echo $? 0
Kami tidak menguji status keluar dari perintah false (ada perintah false ) tetapi string salah terhadap apa-apa. Cara lain untuk menjalankan perintah tes adalah melampirkan ekspresi dengan tanda kurung siku. Cara lain ini lebih mudah dibaca di dalam blok if-then-else.
operan | benar jika |
ekspresi | benar |
! ekspresi | false (meniadakan ekspresi) |
ekspresiA -a ekspresiB | Dan. kedua ekspresi itu benar |
ekspresiA -o ekspresiB | Atau. salah satu ekspresinya benar |
string1 =string2 | kedua string sama |
string1 !=string2 | stringnya berbeda |
int1 -eq int2 | integer1 sama dengan integer2 |
int1-ge int2 | int1>=int2 |
int1 -gt int2 | int1> int2 |
int1 -le int2 | int1 <=int2 |
int1 -lt int2 | int1 |
int1 -ne int2 | int1 tidak sama dengan int2 |
-e file | file ada |
-d direktori | file ada dan merupakan direktori |
Ada lebih banyak ekspresi, itulah yang saya anggap lebih penting. Baca halaman manual untuk pengujian guna mempelajari ekspresi lainnya.
Perhatikan bahwa ada spasi antara tanda kurung siku dan ekspresi. Sekarang kita dapat menggunakan tes untuk melakukan sesuatu berdasarkan nilai sebuah variabel. Misalnya:
kasus
Saat kita ingin menguji sebuah variabel terhadap beberapa nilai, kita dapat menambahkan beberapa elif ke blok if-then-else kita seperti ini:
if [ $a = "value1" ] then command1 for value1 ... commandN for value1 elif [ $a = "value2" ] then command1 for value2 ... commandN for value2 ... elif [ $a = "valueN" ] then command1 for valueN ... commandN for valueN else command1 for every other value ... commandN for every other value fi
Atau kita bisa menggantinya dengan perintah case yang lebih mudah dibaca, dan ditulis:
case expression in value1) command1 for value1 ... commandN for value1 ;; value2) command1 for value2 ... commandN for value2 ;; ... *) command1 for every other value ... commandN for every other value ;; esac
Juga, lebih sedikit penekanan tombol, jangan lupa cukup malas untuk membuat komputer bekerja untuk Anda. Nilai terakhir * adalah kasus default, setiap nilai lain tidak cocok sebelumnya. Huruf mundur, esac , analog dengan pernyataan fi. Jika ;; operator digunakan, tidak ada kecocokan berikutnya yang dicoba setelah kecocokan pola pertama. Untuk menguji pola berikutnya gunakan ;;* operator. Misalnya:
sementara dan sampai
Sementara adalah melakukan sesuatu berulang-ulang saat sesuatu terjadi. Dan sampai sama tetapi dinegasikan (melakukan sesuatu berulang-ulang sementara sesuatu tidak terjadi). Sintaks umumnya adalah:
while command do command1 command2 ... commandN done
Untuk melakukan sesuatu saat tidak terjadi (yaitu status eksis berbeda dari 0), ganti while dengan hingga. Lihat beberapa contoh:
Perhatikan mereka tidak menghasilkan output yang sama. Pada blok while, ketika $a mencapai nilai 4, tidak lebih rendah dari 4, maka pengujian tersebut dinilai salah (dan kode keluarnya> 0). Pada blok sampai, ketika $a mencapai nilai 4, tidak lebih besar dari 4.
Jam di terminal Anda
Kadang-kadang saya menguji cronjob dan itu membuat saya cemas sampai dieksekusi. Saya menggunakan perintah yang sebenarnya (yang, seperti yang Anda bayangkan, menghasilkan status keluar 0) sebagai kondisi, dan menjalankan tanggal perintah berulang-ulang:
while true do date sleep 1 clear done
Ini akan berjalan lebih cepat, tetapi saya dapat menginterupsi dengan ctrl-c.
untuk-masuk -lakukan
Jenis loop ini berulang pada daftar yang disediakan dengan menugaskan setiap item ke variabel. Sintaks:
for i in list of words do command1 ... commandN done
Ini lebih mudah dilihat dalam contoh:
Terus ikuti perkembangannya
Segalanya menjadi rumit, tetapi kami ingin skrip kami mengambil beberapa keputusan untuk melakukan ini atau itu. Saya akan membahas topik lain, tetapi artikel tentang struktur kontrol bash ini telah berkembang terlalu banyak.
Pada yang berikutnya saya akan membahas pipa dan pengalihan. Saya mungkin akan kembali ke struktur kontrol bash ini dengan contoh, sesuatu seperti menggunakan output dari perintah dalam loop for-in dan hal-hal seperti itu.