Cara Menggunakan Tes Bersyarat Braket Ganda di Linux
Diterbitkan: 2022-01-29Tes bersyarat mencabangkan aliran eksekusi skrip Bash Linux sesuai dengan hasil ekspresi logis. Tes kondisional braket ganda sangat menyederhanakan sintaks—tetapi masih memiliki gotcha sendiri.
Kurung Tunggal dan Ganda
Bash menyediakan perintah test
. Ini memungkinkan Anda menguji ekspresi logis. Ekspresi akan mengembalikan jawaban yang menunjukkan respons benar atau salah. Respon yang benar ditunjukkan dengan nilai balik nol. Apa pun selain nol menunjukkan salah.
Merangkai perintah pada baris perintah dengan operator &&
menggunakan fitur ini. Perintah hanya dijalankan jika perintah sebelumnya berhasil diselesaikan.
Jika tes ini benar, kata "Ya" akan dicetak.
tes 15 -eq 15 && echo "Ya"
tes 14 -eq 15 && echo "Ya"
Tes kondisional braket tunggal meniru perintah test
. Mereka membungkus ekspresi dalam tanda kurung “ [ ]
” dan beroperasi seperti perintah test
. Faktanya, mereka adalah program yang sama, dibuat dari kode sumber yang sama. Satu-satunya perbedaan operasional adalah bagaimana versi test
dan versi [
menangani permintaan bantuan.
Ini dari kode sumber:
/* Mengenali --help atau --version, tetapi hanya ketika dipanggil di Bentuk "[", ketika argumen terakhir bukan "]". Gunakan langsung parsing, daripada parse_long_options, untuk menghindari penerimaan singkatan. POSIX memungkinkan "[ --help" dan "[ --version" untuk memiliki perilaku GNU yang biasa, tetapi memerlukan "test --help" dan "test --version" untuk keluar secara diam-diam dengan status 0. */
Kita dapat melihat efeknya dengan meminta test
dan [
untuk bantuan dan memeriksa kode respons yang dikirim ke Bash.
tes --bantuan
gema $?
[ --Tolong
gema $?
Baik test
dan [
adalah shell builtin , artinya mereka dipanggang langsung ke Bash. Tetapi ada juga versi biner mandiri dari [
.
tes tipe
Tipe [
dimana [
Sebaliknya, tes kondisional kurung ganda [[
dan ]]
adalah kata kunci . [[
dan ]]
juga melakukan tes logis, tetapi sintaksnya berbeda. Karena itu adalah kata kunci, Anda dapat menggunakan beberapa fitur rapi yang tidak akan berfungsi dalam versi braket tunggal.
Kata kunci kurung ganda didukung oleh Bash, tetapi tidak tersedia di setiap shell lainnya. Misalnya, cangkang Korn mendukungnya, tetapi cangkang tua biasa, sh, tidak. Semua skrip kami dimulai dengan baris:
#!/bin/bash
Ini memastikan kami memanggil shell Bash untuk menjalankan skrip.
TERKAIT: Cara Membuat dan Menjalankan Skrip Bash Shell di Windows 10
Built-in dan Kata Kunci
Kita dapat menggunakan program compgen
untuk membuat daftar bawaan:
compgen -b | fmt -w 70
Tanpa menyalurkan output melalui fmt
, kita akan mendapatkan daftar panjang dengan masing-masing bawaan pada barisnya sendiri. Lebih mudah dalam contoh ini untuk melihat bawaan dikelompokkan bersama menjadi sebuah paragraf.
Kita dapat melihat test
dan [
dalam daftar, tetapi ]
tidak terdaftar. Perintah [
mencari penutup ]
untuk mendeteksi ketika telah mencapai akhir ekspresi, tetapi ]
bukan bawaan yang terpisah. Itu hanya sinyal yang kami berikan kepada [
untuk menunjukkan akhir dari daftar parameter.
Untuk melihat kata kunci, kita dapat menggunakan:
compgen -k | fmt -w 70
Kata kunci [[
dan ]]
keduanya ada dalam daftar, karena [[
adalah satu kata kunci dan ]]
adalah kata kunci lainnya. Mereka adalah pasangan yang cocok, seperti if
dan fi
, dan case
dan esac
.
Saat Bash mengurai skrip—atau baris perintah—dan mendeteksi kata kunci yang memiliki kata kunci penutup yang cocok, Bash mengumpulkan semua yang muncul di antara mereka dan menerapkan perlakuan khusus apa pun yang didukung kata kunci tersebut.
Dengan builtin, apa yang mengikuti perintah bawaan diteruskan ke sana persis seperti parameter ke program baris perintah lainnya. Ini berarti perhatian khusus harus diberikan oleh penulis skrip mengenai hal-hal seperti spasi dalam nilai variabel.
Shell Globbing
Tes kondisional braket ganda dapat menggunakan shell globbing. Ini berarti tanda bintang “ *
” akan diperluas menjadi “apa saja”.
Ketik atau salin teks berikut ke dalam editor dan simpan ke file bernama “whelkie.sh.”
#!/bin/bash stringvar="Whelkie Brookes" if [[ "$stringvar" == *elk* ]]; kemudian echo "Peringatan mengandung makanan laut" kalau tidak echo "Bebas dari moluska" fi
Untuk membuat skrip dapat dieksekusi, kita perlu menggunakan perintah chmod
dengan opsi -x
(eksekusi). Anda harus melakukan ini pada semua skrip dalam artikel ini jika Anda ingin mencobanya.
chmod +x whelkie.sh
Ketika kami menjalankan skrip, kami melihat string "elk" ditemukan di string "Whelkie", terlepas dari karakter lain apa yang mengelilinginya.
./whelkie.sh
Satu hal yang perlu diperhatikan adalah bahwa kami tidak membungkus string pencarian dalam tanda kutip ganda. Jika Anda melakukannya, globbing tidak akan terjadi. String pencarian akan diperlakukan secara harfiah.
Bentuk lain dari shell globbing diperbolehkan. Tanda tanya “ ?
” akan cocok dengan karakter tunggal, dan tanda kurung siku tunggal digunakan untuk menunjukkan rentang karakter. Misalnya, jika Anda tidak tahu kasing mana yang akan digunakan, Anda dapat menutupi kedua kemungkinan dengan rentang.
#!/bin/bash stringvar="Jean-Claude van Clam" if [[ "$stringvar" == *[cC]lam* ]]; kemudian echo "Peringatan mengandung makanan laut." kalau tidak echo "Bebas dari moluska." fi
Simpan skrip ini sebagai "damme.sh" dan buat itu dapat dieksekusi. Saat kita menjalankannya, pernyataan kondisional akan menjadi true, dan klausa pertama dari pernyataan if dieksekusi.
./damme.sh
Mengutip String
Kami menyebutkan membungkus string dalam tanda kutip ganda sebelumnya. Jika Anda melakukannya, shell globbing tidak akan terjadi. Meskipun konvensi mengatakan itu adalah praktik yang baik, Anda tidak perlu membungkus variabel string dalam tanda kutip saat menggunakan [[
dan ]]
meskipun mengandung spasi. Lihatlah contoh berikutnya. Variabel string $stringvar
dan $surname
keduanya berisi spasi, tetapi tidak ada yang dikutip dalam pernyataan kondisional.
#!/bin/bash stringvar="van Damme" nama keluarga = "van Damme" if [[ $stringvar == $nama keluarga ]]; kemudian echo "Nama keluarga cocok." kalau tidak echo "Nama keluarga tidak cocok." fi
Simpan ini ke dalam file bernama "nama keluarga.sh" dan buat itu bisa dieksekusi. Jalankan menggunakan:
./nama keluarga.sh
Meskipun kedua string mengandung spasi, skrip berhasil dan pernyataan kondisional menjadi benar. Ini berguna ketika berhadapan dengan jalur dan nama direktori yang mengandung spasi. Di sini, opsi -d
mengembalikan nilai true jika variabel berisi nama direktori yang valid.
#!/bin/bash dir="/home/dave/Documents/Perlu Pekerjaan" jika [[ -d ${dir} ]]; kemudian echo "Direktori dikonfirmasi" kalau tidak echo "Direktori tidak ditemukan" fi
Jika Anda mengubah jalur dalam skrip untuk mencerminkan direktori di komputer Anda sendiri, simpan teks ke dalam file bernama "dir.sh" dan buat itu dapat dieksekusi, Anda dapat melihat bahwa ini berfungsi.
./dir.sh
TERKAIT: Cara Bekerja dengan Variabel di Bash
Nama file Globbing Gotchas
Perbedaan menarik antara [ ]
dan [[ ]]
berkaitan dengan nama file dengan globbing di dalamnya. Formulir "*.sh" akan cocok dengan semua file skrip. Menggunakan tanda kurung tunggal [ ]
gagal kecuali ada file skrip tunggal. Menemukan lebih dari satu skrip menimbulkan kesalahan.
Inilah skrip dengan persyaratan braket tunggal.
#!/bin/bash jika [ -a *.sh ]; kemudian echo "Menemukan file skrip" kalau tidak echo "Tidak menemukan file skrip" fi
Kami menyimpan teks ini ke "script.sh" dan membuatnya dapat dieksekusi. Kami memeriksa berapa banyak skrip yang ada di direktori, lalu menjalankan skrip.
ls
./script.sh
Bash melempar kesalahan. Kami menghapus semua kecuali satu file skrip dan menjalankan skrip lagi.
ls
./script.sh
Tes bersyarat mengembalikan nilai true dan skrip tidak menyebabkan kesalahan. Mengedit skrip untuk menggunakan tanda kurung ganda memberikan jenis perilaku ketiga.
#!/bin/bash jika [[ -a *.sh ]]; kemudian echo "Menemukan file skrip" kalau tidak echo "Tidak menemukan file skrip" fi
Kami menyimpan ini ke dalam file bernama "dscript.sh" dan membuatnya dapat dieksekusi. Menjalankan skrip ini di direktori dengan banyak skrip di dalamnya tidak menimbulkan kesalahan, tetapi skrip gagal mengenali file skrip apa pun.
Pernyataan bersyarat yang menggunakan tanda kurung ganda hanya menghasilkan true jika Anda memiliki file yang sebenarnya bernama "*.sh" di direktori.
./dscript.sh
Logika AND dan OR
Tanda kurung ganda memungkinkan Anda menggunakan &&
dan ||
sebagai operator logika AND dan OR.
Skrip ini harus menyelesaikan pernyataan bersyarat menjadi benar karena 10 sama dengan 10 dan 25 kurang dari 26.
#!/bin/bash pertama = 10 detik = 25 if [[ pertama -persamaan 10 && kedua -lt 26 ]]; kemudian echo "Kondisi terpenuhi" kalau tidak echo "Kondisi gagal" fi
Simpan teks ini ke dalam file bernama “and.sh”, buat agar dapat dieksekusi, dan jalankan dengan:
./dan.sh
Script dijalankan seperti yang kita harapkan.
Kali ini kita akan menggunakan ||
operator. Pernyataan bersyarat harus menjadi benar karena meskipun 10 tidak lebih besar dari 15, 25 masih kurang dari 26. Selama perbandingan pertama atau perbandingan kedua benar, pernyataan bersyarat secara keseluruhan menjadi benar.
Simpan teks ini sebagai "or.sh" dan buat itu dapat dieksekusi.
#!/bin/bash pertama = 10 detik = 25 jika [[ pertama -gt 15 || kedua -lt 26 ]]; kemudian echo "Kondisi terpenuhi." kalau tidak echo "Kondisi gagal." fi
./atau.sh
Regex
Pernyataan bersyarat kurung ganda mengizinkan penggunaan operator =~
, yang menerapkan pola pencarian regex dalam sebuah string ke separuh pernyataan lainnya. Jika regex terpenuhi, pernyataan kondisional dianggap benar. Jika regex tidak menemukan kecocokan, pernyataan kondisional akan menjadi false.
TERKAIT: Cara Menggunakan Ekspresi Reguler (regex) di Linux
Simpan teks ini ke file bernama “regex.sh”, dan buat itu bisa dieksekusi.
#!/bin/bash kata = "satu dua tiga" WordsandNumbers="satu 1 dua 2 tiga 3" email="[email protected]" topeng1="[0-9]" mask2="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}" if [[ $kata =~ $mask1 ]]; kemudian echo "\"$words\" berisi angka." kalau tidak echo "Tidak ada angka yang ditemukan di \"$words\"." fi if [[ $WordsandNumbers =~ $mask1 ]]; kemudian echo "\"$WordsandNumbers\" berisi angka." kalau tidak echo "Tidak ada angka yang ditemukan di \"$WordsandNumbers\"." fi if [[ $email =~ $mask2 ]]; kemudian echo "\"$email\" adalah alamat email yang valid." kalau tidak echo "Tidak dapat mengurai \"$email\"." fi
Kumpulan tanda kurung ganda pertama menggunakan variabel string $mask1
sebagai regex. Ini berisi pola untuk semua digit dalam kisaran nol hingga sembilan. Ini menerapkan regex ini ke variabel string $words
.
Kumpulan tanda kurung ganda kedua menggunakan variabel string $mask1
sebagai regex, tetapi kali ini menggunakan variabel string $WordsandNumbers
.
Kumpulan tanda kurung ganda terakhir menggunakan topeng regex yang lebih kompleks dalam variabel string $mask2
.
- [A-Za-z0-9._%+-]+ : Ini cocok dengan karakter apa pun yang berupa huruf besar atau kecil, atau digit apa pun dari nol hingga sembilan, atau titik, garis bawah, tanda persentase, atau tanda plus atau minus . Tanda “
+
” di luar “[]
” berarti ulangi kecocokan tersebut untuk karakter sebanyak yang ditemukan. - @ : Ini hanya cocok dengan karakter “@”.
- [A-Za-z0-9.-]+ : Ini cocok dengan karakter apa pun yang berupa huruf besar atau kecil, atau digit apa pun dari nol hingga sembilan, atau titik atau tanda hubung. Tanda “
+
” di luar “[ ]
” berarti ulangi kecocokan tersebut untuk karakter sebanyak yang ditemukan. - . : Ini cocok dengan "." karakter saja.
- [A-Za-z]{2,4} : Ini cocok dengan huruf besar atau kecil. “
{2,4}
” berarti cocok dengan setidaknya dua karakter, dan paling banyak empat.
Menyatukan itu semua, topeng regex akan memeriksa apakah alamat email dibuat dengan benar.
Simpan teks skrip ke dalam file bernama "regex.sh" dan buat itu dapat dieksekusi. Ketika kami menjalankan skrip, kami mendapatkan output ini.
./regex.sh
Pernyataan bersyarat pertama gagal karena regex mencari digit tetapi tidak ada digit dalam nilai yang disimpan dalam variabel string $words
.
Pernyataan kondisional kedua berhasil karena variabel string $WordsandNumbers
memang berisi angka.
Pernyataan kondisional terakhir berhasil—yaitu, dinyatakan benar—karena alamat email diformat dengan benar.
Hanya Satu Syarat
Tes kondisional braket ganda menghadirkan fleksibilitas dan keterbacaan pada skrip Anda. Hanya dapat menggunakan regex dalam pengujian kondisional Anda membenarkan pembelajaran cara menggunakan [[
dan ]]
.
Pastikan skrip memanggil shell yang mendukungnya, seperti Bash.
TERKAIT: 15 Karakter Khusus yang Perlu Anda Ketahui untuk Bash