Cara menggunakan subshells bash di dalamnya jika pernyataan

Cara menggunakan subshells bash di dalamnya jika pernyataan

Jika Anda pernah menggunakan subshell bash ($ (...)), Anda tahu bagaimana subshell yang fleksibel. Hanya perlu beberapa karakter untuk memulai subshell untuk memproses apa pun yang diperlukan, sejalan dengan pernyataan lain. Jumlah kasus penggunaan yang mungkin hampir tidak terbatas.

Kami juga dapat menggunakan subshells bash di dalamnya jika pernyataan, sejalan dengan pernyataan itu. Melakukan hal itu memberi pengguna dan pengembang banyak fleksibilitas tambahan ketika datang untuk menulis bash jika pernyataan.

Jika Anda belum terbiasa (atau ingin mempelajari lebih lanjut) bash jika pernyataan, silakan lihat pernyataan Bash If kami: jika elif, maka artikel FI.

Dalam tutorial ini Anda akan belajar:

  • Cara menggabungkan subshells bash di dalamnya jika pernyataan
  • Metode Lanjutan Untuk Menggabungkan Subshell Bash Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Secara Berkembang
  • Contoh yang menunjukkan penggunaan subsklell bash di jika pernyataan
Cara menggunakan subshells bash di dalamnya jika pernyataan

Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem Distribusi Linux-independen
Perangkat lunak Baris perintah bash, sistem berbasis Linux
Lainnya Utilitas apa pun yang tidak termasuk dalam shell bash secara default dapat diinstal menggunakan sudo apt-get install-name utilitas (atau instalasi yum untuk sistem berbasis redhat)
Konvensi # - mengharuskan Linux -Commands untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$-mengharuskan Linux-Commands untuk dieksekusi sebagai pengguna biasa

Contoh 1: Mulai sederhana

Mari kita lihat contoh sederhana untuk memulai. Perhatikan bahwa pernyataan ini, sementara dieksekusi di sini di baris perintah, juga dapat dimasukkan ke dalam skrip shell bash (file teks biasa, lebih disukai dengan a .SH ekstensi, dan ditandai sebagai dapat dieksekusi dengan menggunakan chmod +x myscript.SH Perintah - Dimana myscript.SH adalah contoh nama file). Kami juga memperkenalkan kesalahan untuk membuat hal -hal lebih menarik.

$ if ["test" == "$ (echo 'test')"]; Lalu pertandingan Echo!'; lain gema 'tidak cocok!'; FI cocok! $ if ["test" == "$ (gema 'salah')"]; Lalu pertandingan Echo!'; Lain 'tidak cocok!'; fi tidak cocok!: perintah tidak ditemukan $ 


Dalam perintah pertama, kami menggunakan tes sederhana (if ["some_text" == "some_other_text"]; Kemudian… ) untuk memeriksa kesetaraan antara dua string. Untuk string kedua, kami telah memulai subshell bash ($ (...)) untuk mengeluarkan kata tes. Hasilnya adalah itu tes pertandingan tes dan perintah setelah Kemudian Klausul akan dieksekusi, dalam hal ini pertandingan gema!' dieksekusi dan Pertandingan! cetakan.

Dalam perintah kedua, kami mengubah perintah gema menjadi kecocokan teks yang salah dengan membiarkan subshell echo/output salah ($ (gema 'salah')). Kami mendapatkan kesalahan yang tampak aneh. Perhatikan lebih dekat, bisakah Anda menemukan kesalahan? Juga membandingkan perintah kedua dengan yang pertama.

Masalahnya adalah bahwa dalam perintah kedua kami, kalau tidak Klausa (yang dieksekusi saat pertandingan kesetaraan gagal, saya.e. 'Apa kalau tidak untuk dilakukan ketika pernyataan if tidak benar) melewatkan gema memerintah. Sedangkan itu dapat dibaca dengan lancar (jika ... lalu gema ... lain ...) Perintah itu salah karena membutuhkan gema tambahan. Hasilnya adalah bahwa shell bash mencoba mengeksekusi Tidak cocok! Sebagai perintah literal.

Mari kita perbaiki ini!

$ if ["test" == "$ (gema 'salah')"]; Lalu pertandingan Echo!'; lain gema 'tidak cocok!'; fi tidak cocok! 

Jauh lebih baik. Dan kita bisa melihat subshell kita, itu gema, dan penuh jika Pernyataan yang dieksekusi dengan benar. Hebat, mari selami sedikit lebih dalam.

Contoh 2: pernyataan subshell yang sedikit lebih kompleks

$ Var1 = "ABC"; if [["$ (echo" $ var1 ")" == * "b" *]]; Lalu pertandingan Echo!'; lain gema 'tidak cocok!'; FI cocok! $ Var1 = "ADC"; if [["$ (echo" $ var1 ")" == * "b" *]]; Lalu pertandingan Echo!'; lain gema 'tidak cocok!'; fi tidak cocok! 

Di sini kami menetapkan variabel Var untuk keduanya ABC atau ADC dan output selanjutnya variabel ini, sekali lagi menggunakan subshell, dengan kehadiran B di string. Perhatikan bahwa tanda bintang asli (*) awalan ke "B" Bandingkan klausa yang menunjukkan apapun sebelum string ini dan sufiks asterisk (*) Demikian pula berarti apapun setelah string ini. Kita bisa melihat caranya B ditemukan di yang pertama ABC string, tetapi tidak di perintah/string kedua di mana ADC digunakan sebagai string perbandingan.

Perhatikan juga bagaimana kami menggunakan [[...]] Kurung untuk jika pernyataan kali ini. Ini tidak terkait dengan penggunaan subshells, dan ini hanyalah standar penulisan yang lebih baru jika pernyataan yang dapat digunakan untuk kasus penggunaan tambahan atau lainnya kemudian tradisional […] sintaksis. Kami membutuhkannya di sini untuk melakukan yang spesial B Pencocokan yang kami coba, menggunakan tanda bintang (*) awalan dan akhiran ke "B" Bandingkan klausa.

Di sebuah jika pernyataan dengan single […] tanda kurung ini akan gagal:

$ if ["ABC" == * "B" *]; Lalu pertandingan Echo!'; lain gema 'tidak cocok!'; fi tidak cocok! $ if [["ABC" == * "B" *]]; Lalu pertandingan Echo!'; lain gema 'tidak cocok!'; FI cocok! 

Sebagai jika [… ] Sintaks tidak mengenali tanda bintang (*) awalan dan akhiran ke "B" Bandingkan klausa, dan orang perlu digunakan [[...]] Kurung sebagai gantinya.

Hal lain yang perlu diperhatikan adalah bahwa kali ini kami menggunakan kutipan ganda (") Di dalam subshell (alih -alih kutipan tunggal seperti pada contoh pertama): Ketika seseorang memulai subshell, penggunaan kutipan ganda seperti itu tidak hanya diizinkan, tetapi saya dapat sangat merekomendasikannya untuk berbagai kasus penggunaan. Ini berguna dalam beberapa situasi di mana banyak parsing kompleks terjadi dan campuran kutipan tunggal dan ganda diperlukan. Kutipan ganda tidak akan mengakhiri kutipan yang dimulai sebelum dan di luar subshell.

Harap dicatat bahwa dengan sebagian besar contoh sebelumnya, orang bisa meninggalkan subshell dan melakukan perbandingan sederhana secara langsung dengan misalnya variabel, saya.e.:

$ Var1 = "ABC"; if [["$ var1" == * "b" *]]; Lalu pertandingan Echo!'; lain gema 'tidak cocok!'; FI cocok! 

Namun kami memilih untuk memperkenalkan subshells dengan gema (Efektif operasi nol, i.e. Secara efektif sama dengan hanya menggunakan variabel atau teks yang dimaksud) karena akan menyoroti bahwa 1) subsklell bekerja secara efektif, dan 2) bahwa mereka dapat digunakan dari dalam jika pernyataan.

Contoh 3: Pernyataan Subshell Berbasis IF Lanjutan

Kami tidak perlu membatasi penggunaan subkilas kami di dalam jika pernyataan untuk satu perintah, atau untuk penggunaan gema sendiri. Ayo buat pengaturan kecil:

$ touch a $ ls - -color = tidak pernah ./a | WC -L 1 


Kami membuat file bernama A, dan menghitung jumlah baris (menggunakan WC -L, alat penghitung yang dapat menghitung jumlah garis dengan menggunakan -l pilihan). Kami juga memastikan untuk memperkenalkan --warna = tidak pernah opsi untuk ls Untuk menghindari masalah penguraian saat pengkodean warna terminal digunakan.

Selanjutnya, mari kita mengerjakan pernyataan ini secara langsung jika Pernyataan:

$ if [-z "$ (ls - -color = tidak pernah ./a | wc -l) "]; lalu gema" output direktori kosong!"; fi $ if [" $ (ls - -color = tidak pernah ./a | wc -l) "-eq 1]; lalu gema" tepat satu file yang ditemukan!"; fi tepat satu file yang ditemukan! $ 

Di sini kami menggunakan hal yang sama ls… wc -l kode dua kali langsung dari dalam jika penyataan. Pertama jika pernyataan, yang menggunakan -z memeriksa apakah teks antar kutipan (opsi pertama ke -z if-instruksi) kosong. Itu bukan sebagai ls Perintah akan menghasilkan beberapa output dalam kasus ini, mengingat bahwa kami membuat file A.

Dalam perintah kedua, kami benar -benar menguji apakah output dari kami ls… wc -l Perintah sama dengan 1 dengan menggunakan -Persamaan opsi uji di jika penyataan. Persamaan berdiri untuk sama dengan. Perhatikan itu -Persamaan (Dan terbalik -ne makhluk tidak sama dengan) hanya dapat digunakan untuk angka. Untuk string berbasis teks, gunakan == (sama) dan != (tidak sama) sebagai gantinya.

Output perintah (Tepat satu file yang ditemukan!) benar, dan kami jika Pernyataan dengan Subshell Works Multi-Command Incorporated Baik!

Juga menarik untuk dicatat ada bahwa nilai perbandingan pertama di yang kedua jika pernyataan (i.e. $ (ls - -color = tidak pernah ./a | wc -l) dengan output 1) adalah numerik. Jadi, mengapa kami menggunakan dua kutipan ganda ("...") di sekitar pernyataan subshell? Ini tidak ada hubungannya dengan subshells, dan semua dengan caranya jika Bekerja di Bash, dan orang mungkin belum tahu trik atau steno ini; Harap pertimbangkan ini:

$ V = "1 1" $ if [$ v -eq 0]; lalu gema '0'; fi bash: [: terlalu banyak argumen $ if ["$ v" -eq 0]; lalu gema '0'; fi bash: [: 1 1: ekspresi integer diharapkan $ v = 0 $ if ["$ v" -eq 0]; lalu gema '0'; fi 0 

Dengan kata lain, menggunakan kutipan ganda adalah cara pemrograman yang sedikit lebih aman jika pernyataan, bahkan jika kondisinya adalah kondisi berbasis numerik. Ini melindungi terhadap string yang lebih kompleks yang ditafsirkan sebagai item individual daripada nilai tunggal, dan mengembalikan pesan kesalahan yang benar (Ekspresi integer diharapkan), bukannya lebih ambigu Bash: [: Terlalu banyak argumen kesalahan.

Juga tidak masalah dengan bash bahwa Anda membandingkan apa yang tampaknya menjadi string teks (seperti yang ditunjukkan oleh "...") dengan nilai numerik; itu berhasil, asalkan nomornya numerik. Dan jika tidak, itu masih akan memberikan pesan kesalahan yang lebih baik yang menunjukkan bahwa string itu tidak numerik, seperti yang terlihat. Singkatnya, lebih baik untuk selalu mengutip subshell, teks atau variabel Anda dengan kutipan ganda, bahkan saat membandingkan item numerik. Untuk membuktikan ini berfungsi dengan baik, pertimbangkan:

$ if ["1" -eq "1"]; lalu gema 'y'; fi y $ if ["1" -eq "0"]; lalu gema 'y'; fi $ 

Kesimpulan

Dalam artikel ini, kami melihat menggabungkan subsklell bash di dalamnya jika pernyataan. Kami menjelajahi beberapa contoh, dari mudah hingga maju, tentang bagaimana kami dapat menggunakan subshells bash di dalamnya jika pernyataan. Kami juga sedikit menyelam dengan menggunakan kutipan ganda saat membandingkan, bahkan saat membandingkan bidang numerik. Menggunakan subshells di dalam perintah lain, dan dalam hal ini jika Pernyataan adalah cara yang ampuh untuk memperluas keterampilan skrip bash Anda. Menikmati!

Tutorial Linux Terkait:

  • Subshell Linux Lanjutan dengan contoh
  • Subshells Linux untuk pemula dengan contoh
  • Bash If Pernyataan: Jika, elif, lain, lalu, fi
  • Menguasai loop skrip bash
  • Tutorial debugging GDB untuk pemula
  • Multi-threaded Bash Scripting & Manajemen Proses di…
  • Loop bash dengan contoh
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Variabel bash khusus dengan contoh