Cara Menggunakan Tes Bersyarat Braket Ganda di Linux

Diterbitkan: 2022-01-29
fatmawati achmad zaenuri/Shutterstock.com

Tes 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" 

Contoh sederhana dari perintah tes Bash

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. */
Iklan

Kita dapat melihat efeknya dengan meminta test dan [ untuk bantuan dan memeriksa kode respons yang dikirim ke Bash.

 tes --bantuan
 gema $?
 [ --Tolong
 gema $? 

Menggunakan --help pada pengujian dan [

Baik test dan [ adalah shell builtin , artinya mereka dipanggang langsung ke Bash. Tetapi ada juga versi biner mandiri dari [ .

 tes tipe
 Tipe [
 dimana [ 

Menemukan berbagai jenis [ dan perintah pengujian

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
Iklan

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.

Mencantumkan bawaan Bash

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 

Mencantumkan kata kunci Bash

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”.

Iklan

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 

Menggunakan chmod untuk membuat skrip dapat dieksekusi

Ketika kami menjalankan skrip, kami melihat string "elk" ditemukan di string "Whelkie", terlepas dari karakter lain apa yang mengelilinginya.

 ./whelkie.sh 

Menjalankan skrip 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 

Menjalankan skrip 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
Iklan

Simpan ini ke dalam file bernama "nama keluarga.sh" dan buat itu bisa dieksekusi. Jalankan menggunakan:

 ./nama keluarga.sh 

Menjalankan skrip 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 

Menjalankan skrip 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 

Menjalankan skrip script.sh

Iklan

Bash melempar kesalahan. Kami menghapus semua kecuali satu file skrip dan menjalankan skrip lagi.

 ls
 ./script.sh 

Menjalankan skrip script.sh dengan satu skrip di direktori

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 

Menjalankan skrip 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
Iklan

Simpan teks ini ke dalam file bernama “and.sh”, buat agar dapat dieksekusi, dan jalankan dengan:

 ./dan.sh 

Menjalankan skrip and.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 

Menjalankan skrip or.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 .

Iklan

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 

Menjalankan skrip 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.

Iklan

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