GNU/Linux >> Belajar Linux >  >> Linux

Skrip bash(II)

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.


Linux
  1. Skrip bash(I)

  2. Perintah "eval" Di Bash?

  3. perintah ekspor bash

  1. Perintah Bash trap Dijelaskan

  2. Perintah tunggu bash

  3. Jalankan perintah bash pada pipa jenkins

  1. Bash baca Perintah

  2. Bash Heredoc

  3. Perintah Sumber Bash