Parsing pemboleh ubah yang betul dan memetik dalam bash

Parsing pemboleh ubah yang betul dan memetik dalam bash

Memutuskan yang tidak betul dalam kod sumber asal dengan mudah boleh membawa kepada pepijat apabila input yang disediakan oleh pengguna tidak seperti yang diharapkan atau tidak seragam. Dari masa ke masa, ketika skrip bash berubah, kesan sampingan yang tidak diduga dari pemboleh ubah yang tidak disebutkan dapat menyebabkan bug walaupun dalam kod yang tidak disentuh. Ini lebih penting lagi untuk aplikasi berkaitan keselamatan yang mungkin terdedah kepada percubaan penggodaman. Ketahui cara melakukan petikan dan parsing/pengesahan berubah dengan betul dari awal, dan elakkan banyak isu ini! Mari kita mulakan…

Dalam siri tutorial ini, anda akan belajar:

  • Cara mengutip pembolehubah bash anda dengan betul
  • Peringatan dan hasil petikan yang tidak betul
  • Bagaimana memastikan nilai berubah adalah apa yang sepatutnya
  • Cara Memeriksa Nilai Pembolehubah Berdasarkan Kosong, Numerik dan Teks
Parsing pemboleh ubah yang betul dan memetik dalam bash

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 yum dan bukannya apt-get)
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: Petikan pembolehubah tersebut!

Kecuali anda bekerja dengan nilai berangka, dan walaupun dalam kes itu pada masa-masa, adalah bijak untuk selalu mengutip pembolehubah berasaskan teks anda semasa memeriksa kesamaan dll. Mari lihat contoh:

$ Var1 = "a"; jika [$ var1 == "a"]; Kemudian echo 'ya!'; fi ya! $ Var1 =; jika [$ var1 == "a"]; Kemudian echo 'ya!'; fi bash: [: ==: operator unary dijangka 


Pertama kita tetapkan Var1 kepada nilai a dan kemudian diperiksa jika Var1 sama a. Yang berfungsi, dan kami mungkin menganggap kod kami baik-baik saja dan meninggalkannya di dalam skrip kami. Walau bagaimanapun, beberapa waktu kemudian dan selepas banyak perubahan kod, kita mula melihat Bash: [: ==: operator unary dijangka - Mesej yang agak misteri memberitahu kita ada sesuatu yang salah dengan kod kami.

Sebabnya ditunjukkan dalam contoh kedua. Sekiranya entah bagaimana pemboleh ubah kita kosong, saya.e. Telah gagal ditetapkan dengan betul (atau telah dipadamkan sejak penetapan), maka kami akan dibentangkan dengan kesilapan sebagai bash dengan berkesan membaca ini; jika [== "a"] yang merupakan pernyataan yang tidak masuk akal, dan ia gagal mengira.

Sekiranya kita betul -betul memetik pemboleh ubah kita dengan petikan berganda ("), ini tidak akan berlaku:

$ Var1 =; jika ["$ var1" == "a"]; Kemudian echo 'ya!'; fi $ 

Kali ini, Bash membaca kenyataan itu sebagai jika ["" == "a"] - pernyataan lebih mudah di mata dan pengkompil bash. Tiada output dijana dengan jelas rentetan kosong tidak sama dengan huruf a.

Contoh 2: Mengambil sebut harga sedikit lebih jauh

Sebaik sahaja anda telah bekerja dengan Bash untuk seketika, anda akan mempelajari sebahagian daripada bahasa idiom itu. Salah satu ungkapan seperti itu - mari kita sebut keistimewaan (dan pastinya adalah kemudahan!) - untuk dapat mengutip pembolehubah angka walaupun operasi angka sedang dilaksanakan:

$ Var1 = 13; jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi ya! $ Var1 = 7; jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi 

Walaupun VAR1 ditetapkan kepada nilai angka, Bash akan menerima " Memetik sekitar VAR1 dan dengan betul menghasilkan hasil pernyataan jika menggunakan sama (i.e. -Pers) Operasi perbandingan.

Namun, kami belum mencapai bulatan penuh, kerana perkara berikut masih gagal;

$ Var1 =; jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi bash: [:: ungkapan integer dijangka 

Kali ini ungkapan integer dijangka, namun pemboleh ubah kosong (i.e. "" diluluskan), dan ini pastinya tidak angka. Adakah cara untuk memperbaikinya? Pasti:

Contoh 3: Memeriksa panjang sifar

$ Var1 =; jika [-n "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; fi $ var1 = 13; jika [-n "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; fi ya! 

Di sini kita menggunakan pra-pemeriksaan untuk melihat apakah pembolehubah tidak mempunyai panjang sifar dengan menggunakan pernyataan bersyarat -n yang bermaksud rentetan tidak mempunyai panjang sifar. Ini juga boleh ditukar dengan sebaliknya dengan menggunakan ! -z di mana -z bermaksud rentetan mempunyai panjang sifar dan juga ! menafikan sama, i.e. membalikkan hasilnya:

$ Var1 =; Sekiranya [ ! -z "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; fi $ var1 = 13; Sekiranya [ ! -z "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; fi ya! $ Var1 = 7; Sekiranya [ ! -z "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; fi $ 


Kami juga menambah = 7 Contoh di sini untuk menunjukkan bagaimana jika Pernyataan berfungsi dengan betul. Sentiasa menguji anda jika Kenyataan dan syarat dalam pelbagai situasi, menggunakan kes dan pengecualian generik (nilai buruk, tiada nilai, nilai ganjil, dll.) Sekiranya anda ingin memastikan kod anda bebas daripada pepijat.

Contoh 4: Pemeriksaan hampir lengkap

Masih ada kelemahan dalam contoh terakhir. Adakah anda mengambilnya? Pada asasnya, jika kita lulus nilai teks ke rentetan, atau jika pernyataan masih gagal:

$ Var1 = "a"; Sekiranya [ ! -z "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; fi bash: [: a: ungkapan integer dijangka 

Ini dapat diatasi dengan menggunakan subshell, grep, dan beberapa ungkapan biasa. Untuk maklumat lanjut mengenai ungkapan biasa, lihat Bash Regexps kami untuk pemula dengan contoh dan canggih Bash Regex dengan artikel contoh. Untuk maklumat lanjut mengenai Bash Subshells, lihat Linux Subshells kami untuk pemula dengan contoh dan subshell Linux maju dengan artikel contoh.

Sintaks tidak terlalu kompleks:

$ Var1 = 7; jika ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; fi $ var1 = 13; jika ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; fi ya! $ Var1 = "a"; jika ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; fi $ 

Hebat. Di sini kita periksa kandungan Var1 menjadi angka dengan menggunakan a grep -o (grep sahaja; i.e. grep hanya bahagian yang dipadankan dengan rentetan carian, yang dalam hal ini ungkapan biasa). Kami memilih watak nombor dari 0-9 dan ini satu atau lebih kali (seperti yang ditunjukkan oleh \+ kualifikasi kepada [0-9] julat pemilihan). Kemudian, kami mencuba dan memadankan ini grep dipadankan bahagian sahaja teks terhadap pemboleh ubah asal. Sama? Sekiranya ya, maka pemboleh ubah kami terdiri daripada nombor sahaja.

Semasa kita mengembangkan luar kita jika pernyataan sedikit untuk memasukkan lain fasal yang akan memberitahu kami jika pemboleh ubah tidak berangka, dan ketika kami mencuba dan masuk 'a' Sebagai input kita melihat bahawa pelbagai input masing -masing dihuraikan dengan betul;

$ Var1 = 7; jika ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; lain echo 'pemboleh ubah tidak angka!'; fi $ var1 = 13; jika ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; lain echo 'pemboleh ubah tidak angka!'; fi ya! $ Var1 = "a"; jika ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; lain echo 'pemboleh ubah tidak angka!'; pemboleh ubah fi tidak angka! 


Jadi sekarang kami mempunyai garis yang sempurna untuk kod kami, tidak? Tidak ... kita masih kehilangan sesuatu ... adakah anda melihat apa?

Contoh 5: Pemeriksaan lengkap

Adakah anda melihat masalahnya? Kami belum memeriksa pemboleh ubah kosong!

$ Var1 = "; if [" $ (echo "$ var1" | grep -o '[0-9] \+') "==" $ var1 "]; "-eq 13]; kemudian echo 'ya!'; fi; lain echo 'pemboleh ubah tidak angka!'; fi bash: [:: ungkapan integer dijangka 

Aduh. Saya percaya sekarang anda melihat mengapa saya kerap menyebutkan dalam artikel saya untuk sentiasa memeriksa ciptaan kod anda dalam satu cara atau yang lain. Pasti, Bash meminjamkan dirinya kepada skrip cepat dan mudah, tetapi jika anda ingin memastikan perkara akan terus berfungsi dengan baik apabila menukar skrip anda atau menambah kod tambahan, anda akan memastikan ujian, input dan output anda bersih dan jelas ditakrifkan. Pembaikannya mudah:

$ Var1 = "; jika [ ! -z "$ var1" -a "$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; maka jika ["$ var1" -eq 13]; Kemudian echo 'ya!'; fi; lain echo 'pemboleh ubah tidak angka!'; pemboleh ubah fi tidak angka! 

Di sini, menggunakan penumbuk jika pernyataan, kami menambah syarat tambahan untuk pemboleh ubah Var1 untuk tidak (!) menjadi pemboleh ubah panjang sifar. Ini berfungsi dengan baik diberikan persediaan semasa sebagai bahagian kedua yang pertama jika pernyataan masih boleh diteruskan tanpa mengira kandungan Var1.

Kesimpulan

Dalam artikel ini, kita melihat bagaimana untuk mengutip dan menghuraikan/menilai pembolehubah dengan betul, dan kami meneroka betapa kompleksnya untuk menulis sekeping kod pemeriksaan yang sempurna. Belajar bagaimana melakukan perkara -perkara ini dengan betul dari awal akan mengehadkan jumlah pepijat yang mungkin boleh diperkenalkan secara tidak sengaja.

Nikmati, dan sebut ganda pembolehubah tersebut! 🙂

Tutorial Linux Berkaitan:

  • Senarai alat Kali Linux terbaik untuk ujian penembusan dan ..
  • Mengendalikan input pengguna dalam skrip bash
  • Gelung bersarang dalam skrip bash
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Advanced Bash Regex dengan contoh
  • Tutorial Debugging GDB untuk Pemula
  • Menguasai Gelung Skrip Bash
  • Pemboleh ubah bash khas dengan contoh
  • Ungkapan biasa python dengan contoh
  • Cara Menggunakan Subshells Bash Di dalam Jika Kenyataan