Cara Menggunakan Subshells Bash Di dalam Jika Kenyataan

Cara Menggunakan Subshells Bash Di dalam Jika Kenyataan

Sekiranya anda pernah menggunakan Bash Subshells ($ (...)), anda tahu bagaimana subshells fleksibel boleh. Hanya memerlukan beberapa watak untuk memulakan subshell untuk memproses apa -apa yang diperlukan, sejajar dengan pernyataan lain. Bilangan kes penggunaan yang mungkin hampir tidak terhad.

Kita juga boleh menggunakan subshells bash di dalam jika pernyataan, sejajar dengan pernyataan. Melakukannya memberi pengguna fleksibiliti tambahan pengguna dan pemaju ketika menulis Bash jika pernyataan.

Sekiranya anda belum biasa (atau ingin mengetahui lebih lanjut mengenai) bash jika pernyataan, sila lihat bash kami jika pernyataan: jika elif lain maka artikel fi.

Dalam tutorial ini anda akan belajar:

  • Cara Menggabungkan Subshells Bash di dalam jika pernyataan
  • Kaedah lanjutan untuk menggabungkan subshells bash sejajar dengan arahan lain
  • Contoh yang menunjukkan penggunaan subshells bash di jika pernyataan
Cara Menggunakan Subshells Bash Di dalam Jika Kenyataan

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran linux-bebas
Perisian Baris perintah bash, sistem berasaskan linux
Yang lain Sebarang utiliti yang tidak termasuk dalam shell bash secara lalai boleh dipasang menggunakan sudo apt-get memasang nama utiliti (atau pemasangan yum untuk sistem berasaskan redhat)
Konvensyen # - memerlukan komando linux untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$-Memerlukan komando linux untuk dilaksanakan sebagai pengguna yang tidak istimewa

Contoh 1: Memulakan Mudah

Mari kita lihat contoh mudah untuk bermula. Perhatikan bahawa kenyataan ini, sementara dilaksanakan di sini di baris arahan, juga boleh dimasukkan ke dalam skrip shell bash (fail teks biasa, sebaiknya dengan a .sh lanjutan, dan ditandakan sebagai boleh dilaksanakan dengan menggunakan chmod +x myscript.sh Perintah - di mana myscript.sh adalah contoh nama fail). Kami juga memperkenalkan kesilapan untuk menjadikan sesuatu lebih menarik.

$ jika ["ujian" == "$ (echo 'test')"]; Kemudian echo 'perlawanan!'; lain echo 'tidak sepadan!'; perlawanan fi! $ jika ["ujian" == "$ (echo 'tidak betul')"]; Kemudian echo 'perlawanan!'; lain 'tidak sepadan!'; FI tidak sepadan!: Perintah tidak dijumpai $ 


Dalam perintah pertama, kami menggunakan ujian mudah (jika ["some_text" == "some_other_text"]; Kemudian… ) untuk memeriksa kesamaan antara dua tali. Untuk rentetan kedua, kami telah memulakan subshell bash ($ (...)) untuk mengeluarkan perkataan ujian. Hasilnya ialah ujian perlawanan ujian dan begitu arahan selepas kemudian Fasal akan dilaksanakan, dalam kes ini Perlawanan echo '!' dilaksanakan dan Perlawanan! cetakan.

Dalam perintah kedua, kami menukar perintah echo ke pertandingan teks yang salah dengan membiarkan subshell echo/output tidak betul ($ (echo 'tidak betul')). Kami mendapat kesilapan yang pelik kembali. Lihatlah dengan teliti, bolehkah anda melihat ralat? Bandingkan juga arahan kedua dengan yang pertama.

Masalahnya ialah dalam arahan kedua kami, lain Fasal (yang dilaksanakan apabila perlawanan kesamaan gagal, i.e. 'apa lain untuk dilakukan apabila pernyataan jika tidak benar) merindui echo perintah. Sedangkan ia boleh membaca dengan lancar (jika ... kemudian echo ... lain ...) perintah itu tidak betul kerana ia memerlukan echo tambahan. Hasilnya adalah bahawa shell bash cuba melaksanakan Tidak sepadan! Sebagai arahan literal.

Mari memperbaiki perkara ini!

$ jika ["ujian" == "$ (echo 'tidak betul')"]; Kemudian echo 'perlawanan!'; lain echo 'tidak sepadan!'; FI tidak sepadan! 

Lebih baik. Dan kita dapat melihat subshell kita, itu echo, dan penuh jika penyata yang dilaksanakan dengan betul. Hebat, mari kita menyelam sedikit lebih dalam.

Contoh 2: Penyataan Subshell yang lebih kompleks jika

$ Var1 = "abc"; jika [["$ (echo" $ var1 ")" == * "b" *]]; Kemudian echo 'perlawanan!'; lain echo 'tidak sepadan!'; perlawanan fi! $ Var1 = "ADC"; jika [["$ (echo" $ var1 ")" == * "b" *]]; Kemudian echo 'perlawanan!'; lain echo 'tidak sepadan!'; FI tidak sepadan! 

Di sini kami menetapkan pemboleh ubah Var sama ada ABC atau ADC dan output seterusnya pemboleh ubah ini, sekali lagi menggunakan subshell, terhadap kehadiran b dalam rentetan. Perhatikan bahawa asterisk asal (*) awalan ke "b" Bandingkan klausa menunjukkan apa -apa sebelum rentetan ini Dan akhiran asterisk (*) Begitu juga apa sahaja selepas rentetan ini. Kita dapat melihat bagaimana b dijumpai pada yang pertama ABC rentetan, tetapi tidak dalam perintah kedua/rentetan di mana ADC digunakan sebagai rentetan membandingkan.

Perhatikan juga bagaimana kami menggunakan [[...]] kurungan untuk jika pernyataan kali ini. Ini tidak berkaitan dengan penggunaan subshells, dan ini hanyalah standard penulisan bash yang lebih baru jika pernyataan yang boleh digunakan untuk kes tambahan atau lain -lain lagi maka tradisional [...] sintaks. Kami memerlukannya di sini untuk melakukan yang istimewa b pemadanan yang kita cuba, menggunakan asterisk (*) awalan dan akhiran ke "b" Bandingkan klausa.

Didalam jika pernyataan dengan single [...] kurungan ini akan gagal:

$ jika ["abc" == * "b" *]; Kemudian echo 'perlawanan!'; lain echo 'tidak sepadan!'; FI tidak sepadan! $ jika [["abc" == * "b" *]]; Kemudian echo 'perlawanan!'; lain echo 'tidak sepadan!'; perlawanan fi! 

Sebagai jika [...] sintaks tidak mengenali asterisk (*) awalan dan akhiran ke "b" Bandingkan klausa, dan seseorang perlu digunakan [[...]] kurungan sebaliknya.

Perkara lain yang perlu diperhatikan ialah kali ini kami menggunakan sebut harga berganda (") di dalam subshell (bukan sebut harga tunggal seperti dalam contoh pertama): Apabila seseorang memulakan subshell, penggunaan sebut harga berganda itu bukan sahaja dibenarkan, tetapi saya boleh mengesyorkannya untuk pelbagai kes penggunaan. Ia berguna dalam beberapa situasi di mana banyak parsing kompleks sedang berlaku dan campuran sebut harga tunggal dan berganda diperlukan. Petikan berganda tidak akan menamatkan petikan yang bermula sebelum dan di luar subshell.

Sila ambil perhatian bahawa dengan sebahagian besar contoh sebelumnya, seseorang hanya boleh melepaskan subshell dan melakukan perbandingan mudah secara langsung dengan contohnya pembolehubah, i.e.:

$ Var1 = "abc"; jika [["$ var1" == * "b" *]]; Kemudian echo 'perlawanan!'; lain echo 'tidak sepadan!'; perlawanan fi! 

Kami memilih untuk memperkenalkan subshells dengan echo (berkesan operasi, i.e. berkesan sama seperti menggunakan pembolehubah atau teks yang dipersoalkan) kerana ia akan menyerlahkan bahawa 1) subshells berfungsi dengan berkesan, dan 2) bahawa mereka boleh digunakan dari dalam jika pernyataan.

Contoh 3: Kenyataan Subshell berasaskan Lanjutan IF

Kami tidak perlu menyekat penggunaan subshell kami di dalam jika pernyataan kepada satu arahan, atau penggunaannya echo sahaja. Mari buat persediaan kecil:

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


Kami membuat fail yang dinamakan a, dan mengira bilangan baris (menggunakan WC -L, alat pengiraan yang boleh mengira bilangan baris dengan menggunakan -L pilihan). Kami juga memastikan memperkenalkan --warna = tidak pernah pilihan untuk ls Untuk mengelakkan masalah parsing apabila pengekodan warna terminal digunakan.

Seterusnya, mari kita buat pernyataan ini terus masuk jika Penyataan:

$ jika [-z "$ (ls - -color = tidak pernah ./a | wc -l) "]; kemudian echo" output direktori kosong!"; fi $ if [" $ (ls - -color = tidak pernah ./a | wc -l) "-eq 1]; kemudian echo" betul -betul satu fail yang dijumpai!"; fi betul -betul satu fail yang dijumpai! $ 

Di sini kita menggunakan yang sama LS ... WC -L kod dua kali terus dari dalam jika penyata. Yang pertama jika pernyataan, yang menggunakan -z memeriksa jika teks antara petikan (pilihan pertama ke -z jika instruksi) kosong. Ia bukan seperti ls Perintah akan menghasilkan beberapa output dalam kes ini, memandangkan kami membuat fail a.

Dalam perintah kedua, kami sebenarnya menguji jika output dari kami LS ... WC -L arahan sama dengan 1 dengan menggunakan -Pers Pilihan ujian di jika penyata. Pers bermaksud sama dengan. Perhatikan bahawa -Pers (Dan ia terbalik -ne menjadi tidak sama dengan) hanya boleh digunakan untuk nombor. Untuk rentetan berasaskan teks, gunakan == (sama) dan != (tidak sama) sebaliknya.

Output arahan (Betul -betul satu fail yang dijumpai!) betul, dan kami jika Penyata dengan subshell multi-komando yang diperbadankan berfungsi dengan baik!

Juga menarik perhatian ada nilai bandingkan yang pertama di tempat kedua jika penyataan (i.e. $ (ls -color = tidak pernah ./a | wc -l) dengan output 1) adalah angka. Jadi, mengapa kita menggunakan dua petikan berganda ("...") Sekitar pernyataan Subshell? Ini tidak ada kaitan dengan subshells, dan semua dengan bagaimana jika Bekerja di Bash, dan seseorang mungkin tidak tahu helah ini atau tersendiri lagi; Sila pertimbangkan ini:

$ V = "1 1" $ if [$ v -eq 0]; kemudian echo '0'; fi bash: [: terlalu banyak argumen $ if ["$ v" -eq 0]; kemudian echo '0'; fi bash: [: 1 1: ungkapan integer dijangka $ v = 0 $ if ["$ v" -eq 0]; kemudian echo '0'; fi 0 

Dengan kata lain, menggunakan petikan berganda adalah cara pengaturcaraan yang sedikit lebih selamat jika pernyataan, walaupun keadaannya adalah keadaan berasaskan angka. Ia melindungi terhadap rentetan yang lebih kompleks yang ditafsirkan sebagai item individu dan bukannya satu nilai, dan ia mengembalikan mesej ralat yang betul (Ekspresi integer dijangka), bukannya lebih jelas Bash: [: Terlalu banyak hujah ralat.

Ia juga tidak penting untuk membandingkan bahawa anda membandingkan apa yang kelihatan seperti rentetan teks (seperti yang ditunjukkan oleh "...") dengan nilai angka; ia berfungsi, dengan syarat nombor itu angka. Dan jika tidak, ia masih akan memberikan mesej ralat yang lebih baik yang menunjukkan bahawa rentetan itu tidak angka, seperti yang dilihat. Ringkas. Untuk membuktikan ini berfungsi dengan baik, pertimbangkan:

$ jika ["1" -eq "1"]; kemudian echo 'y'; fi y $ if ["1" -eq "0"]; kemudian echo 'y'; fi $ 

Kesimpulan

Dalam artikel ini, kami melihat menggabungkan subshells bash di dalam jika pernyataan. Kami meneroka beberapa contoh, dari mudah hingga maju, bagaimana kita boleh menggunakan subshells bash di dalam jika pernyataan. Kami juga menyelam sedikit menggunakan petikan berganda ketika membandingkan, walaupun membandingkan medan angka. Menggunakan subshells di dalam arahan lain, dan dalam kes ini jika Kenyataan adalah cara yang kuat untuk mengembangkan kemahiran skrip bash anda. Nikmati!

Tutorial Linux Berkaitan:

  • Subshells Linux Lanjutan dengan contoh
  • Subshells Linux untuk pemula dengan contoh
  • Bash jika pernyataan: jika, elif, lain, maka, fi
  • Menguasai Gelung Skrip Bash
  • Tutorial Debugging GDB untuk Pemula
  • Pengurusan skrip & proses bash berbilang threaded di…
  • Gelung bash dengan contoh
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Pemboleh ubah bash khas dengan contoh