Pemboleh ubah bash khas dengan contoh

Pemboleh ubah bash khas dengan contoh

Bash adalah bahasa pengekodan yang hebat, yang membolehkan anda melakukan perkara yang rumit seperti manipulasi data besar, atau hanya membuat skrip pengurusan desktop.

Kemahiran peringkat kemasukan yang diperlukan untuk menggunakan bahasa bash agak rendah, dan skrip satu-liner (jargon yang sering digunakan, yang menunjukkan pelbagai arahan yang dilaksanakan di baris arahan, membentuk skrip mini), serta skrip biasa, boleh tumbuh dalam kerumitan (dan seberapa ditulis mereka) sebagai pemaju bash belajar lebih banyak.

Belajar menggunakan pembolehubah khas di bash adalah salah satu bahagian lengkung pembelajaran ini. Sedangkan pada asalnya pembolehubah khas mungkin kelihatan misteri: $$, $?, $*, \ $ 0, $ 1, dll., Sebaik sahaja anda memahaminya dan menggunakannya dalam skrip anda sendiri, perkara -perkara akan menjadi lebih jelas dan lebih mudah diingat.

Dalam tutorial ini anda akan belajar:

  • Cara Menggunakan Pembolehubah Khas di Bash
  • Cara mengutip pembolehubah dengan betul, malah yang istimewa
  • Contoh menggunakan pembolehubah khas dari baris arahan dan skrip

Pemboleh ubah bash khas dengan contoh

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
  1. $$ - Paparkan PID (Pengenalpastian Proses)

    Dalam contoh ini, kami menggunakan pemboleh ubah khas $$ untuk memaparkan PID (Pengenalpastian Proses) untuk program semasa kami. Ini berfungsi sedikit berbeza bergantung kepada sama ada anda menggunakan pembolehubah ini dari baris arahan:

    $ echo $$ 316204 $ ps -ef | grep -e "$$ | pid" uid pid ppid c stime tty time cmd roel 316204 62582 0 11:53 pts/2 00:00:00 bash roel 316499 316204 0 11:57 pts/2 00:00 ps - EF ROEL 316500 316204 0 11:57 PTS/2 00:00:00 GREP -E 316204 | PID 

    Atau dari dalam skrip. Sebagai contoh, mari kita pertimbangkan skrip berikut ujian.sh:

    echo $$ ps -ef | grep -e "$$ | pid" 
    Salinan

    Yang, ketika kita membuatnya boleh dilaksanakan (ujian chmod +x.sh) dan melaksanakan, menghasilkan:

    $ chmod +x ujian.sh $ ./ujian.sh 316820 uid pid ppid c stime tty time cmd roel 316820 316204 0 12:01 pts/2 00:00:00 bash roel 316821 316820 0 12:01 pts/2 00:00 ps -ef 01 pts/2 00:00:00 grep -e 316820 | PID 

    Perbezaannya ada Pid dihasilkan! Ini mungkin pada pandangan pertama masuk akal, tetapi mari kita jelaskan sebab utama mengapa Pid berbeza: kami menggunakan cangkang bash yang berbeza. Perintah pertama yang dilaksanakan secara langsung berada di baris arahan, dan dengan itu kami istimewa $$ pemboleh ubah (yang mengenal pasti PID program yang sedang berjalan) menghasilkan Pid dari shell bash yang sedang berjalan (menjadi 316204).

    Dalam contoh kedua, kami menjalankan skrip dan setiap permulaan skrip akan sentiasa memulakan cangkang bash baru. Hasilnya ialah kita Pid adalah Pid dari shell bash yang baru bermula (316820). Kami juga boleh mengesahkan ini dengan melihat Ppid (i.e. Ibu bapa PID, atau ibu bapa pengenal proses) - ia adalah 316204 yang sepadan dengan shell bash kami dari mana kami memulakan skrip, seperti yang dilihat dalam contoh pertama (kedua -dua contoh pertama dan kedua telah dilaksanakan di terminal yang sama pada mesin yang sama).

    The grep -e Perintah dalam dua contoh kami membolehkan kami menangkap baris pertama senarai proses penuh mesin (seperti yang diperolehi oleh ps -ef) dengan membenarkan sokongan regex lanjutan dan Grepping untuk Pid Selain kami Pid (dengan menggunakan $$). The | adalah pemisah ekspresi biasa yang dilanjutkan yang membolehkan penangkapan dwi ini.

    Untuk maklumat lanjut mengenai ungkapan biasa, sila lihat Bash Regexps kami untuk pemula dengan contoh dan canggih Bash Regex dengan artikel contoh.

    Perhatikan juga bahawa kami telah mengautomasikan penangkapan PID dengan menggunakan $$ di dalam grep perintah. Ini $$ Pembolehubah tidak pernah berubah melainkan shell / subshell bash baru dimulakan, seperti yang dapat kita lihat dalam contoh berikut:

    $ echo $$ 316204 $ bash $ echo $$ 318023 $ echo $ ppid 316204 

    The Pid shell bash utama kami masih ada 316204 seperti dahulu. Seterusnya, kami memulakan Subshell baru dan Pid dari cangkang baru ini adalah 318023 semasa diperiksa. Dan, menggunakan pembolehubah automatik (oleh bash) $ Ppid Kami boleh mengesahkan Ppid (ID proses induk) shell bash menengah/subshell sebagai 316204, yang sepadan dengan kulit utama kami. Seperti yang anda lihat, dari segi pengurusan proses dan khususnya $$ pemboleh ubah, tidak banyak perbezaan antara memulakan skrip dan subshell baru.

    Untuk maklumat lanjut mengenai Pengurusan Proses Bash, anda mungkin ingin menyemak Pengurusan Proses Latar Belakang Bash dan Pengurusan Senarai Proses dan Artikel Penamatan Proses Automatik.



  2. $? - Kod Keluar

    The $? pemboleh ubah memberitahu kita apa yang Kod Keluar adalah arahan sebelumnya. Mengetahui Kod Keluar pernyataan yang dilaksanakan membolehkan kami meneruskan skrip dalam dua atau lebih arah yang berbeza. Contohnya, jika kita memulakan a rm Perintah (untuk memadam beberapa fail) dari dalam program, kami mungkin ingin menyemak sama ada proses itu berjaya.

    Jika Kod Keluar adalah 0, secara amnya (baca: hampir selalu) bermaksud bahawa proses ditamatkan dengan jayanya. Jika bagaimanapun Kod Keluar adalah 1 (atau lebih) ia sering (walaupun tidak selalunya) bermaksud bahawa proses ditamatkan dengan ralat atau hasil negatif, contohnya fail tidak dapat dipadam dalam contoh kami. Mari kita lihat bagaimana ini berfungsi di baris arahan, ingat bahawa kerja pembolehubah ini dari dalam skrip adalah sama.

    $ sentuh ini.wujud $ rm ini.wujud $ echo $? 0 $ rm ini.tidak.tidak.ada RM: tidak dapat mengeluarkan 'ini.tidak.tidak.wujud ': tiada fail atau direktori sedemikian $ echo $? 1 

    Kami mula -mula membuat fail ini.ada dengan menggunakan sentuh perintah. sentuh Cukup buat fail bersaiz sifar tanpa menulis apa-apa kepadanya. Seterusnya kami mengeluarkan fail menggunakan rm ini.ada dan memaparkan $? Kod Keluar Menggunakan echo. Hasilnya adalah 0 kerana arahan berjaya seperti yang dijangkakan dan dilihat tanpa kesilapan yang dikembalikan.

    Seterusnya, kami mencuba dan memadam fail yang tidak wujud dan menerima ralat. Apabila kita memeriksa kod keluar memang memang 1 menunjukkan beberapa ralat berlaku. Kita boleh menyemak nilai pembolehubah ini dengan mudah dari baris arahan atau dari dalam skrip dengan menggunakan jika [$? -eq 0]; kemudian atau pernyataan bersyarat yang serupa (ditamatkan oleh fi).

    Untuk mengetahui lebih lanjut mengenai jika pernyataan berasaskan, sila lihat bash jika pernyataan jika elif lain maka fi. Menggabungkan $? dengan jika Kenyataan adalah biasa dan berkuasa untuk mengautomasikan pelbagai perkara di Bash.

  3. $ 1, $ 2, ... $* - Argumen lulus

    Apabila kita memulakan skrip di baris arahan bash, kita boleh lulus argumen yang sama. Ia sepenuhnya sampai kepada skrip untuk mengendalikan hujah -hujah yang disampaikan kepadanya. Sekiranya skrip misalnya tidak mengendalikan hujah sama sekali (lalai), maka tidak ada akibat sama ada menentukan atau tidak menentukan apa -apa, atau banyak, pembolehubah ke skrip.

    Kami boleh mengendalikan hujah lulus dengan menggunakan pembolehubah khas $ 1, $ 2, $* dan lain-lain. Hujah pertama yang diserahkan kepada skrip akan selalu ada $ 1, Hujah kedua akan selalu ada $ 2 dan lain-lain. Satu perkara yang perlu diperhatikan ialah jika anda memperkenalkan ruang dalam klien bash yang dikonfigurasikan lalai, maka Bash akan mentafsir ruang itu sebagai pemisah.

    Sekiranya anda cuba lulus beberapa teks seperti ini adalah contoh Anda perlu memetiknya dengan betul seperti ini: "Ini adalah contoh"; Agar Bash melihat teks itu sebagai pemboleh ubah tunggal yang diluluskan.



    Yang istimewa $* Pembolehubah adalah singkat untuk menulis Semua pembolehubah menjadi rentetan tunggal. Mari lihat bagaimana ini berfungsi dengan menentukan yang baru ujian2.sh Skrip seperti berikut:

    echo "1: $ 1" echo "2: $ 2" echo "all: $ *" 
    Salinan

    Sebagai sedikit variasi, kami memilih untuk menentukan pembolehubah kami di sini $ 1 ke $ * bukan $ 1 ke $*. Sebenarnya, adalah idea yang baik untuk selalu memetik pembolehubah dengan cara ini. Untuk maklumat lanjut, sila lihat parsing pembolehubah yang betul dan memetik dalam artikel Bash.

    Apabila kita melaksanakan yang sama, menggunakan dua atau tiga hujah, kita lihat:

    $ chmod +x test2.sh $ ./test2.SH '1 "2' 1: 1 2: 2 Semua: 1 2 $ ./test2.SH '1 "2" 3' 1: 1 2: 2 Semua: 1 2 3 

    Kita dapat melihat bagaimana input pertama kita ke skrip diiktiraf dengan betul $ 1 dan lain-lain. Juga, kita perhatikan bahawa hujah ketiga benar -benar diabaikan oleh skrip sehingga mencapai echo "Semua: $ *" Arahan yang memang menunjukkan semua hujah seperti yang dibincangkan sebelumnya. Mari kita meneroka input yang salah tanpa mengutip:

    $ ./test2.SH ini dimaksudkan untuk menjadi satu ayat. 1: ini 2: semuanya: ini dimaksudkan untuk menjadi satu ayat. $ ./test2.sh "Ini dimaksudkan untuk menjadi satu ayat."1: Ini dimaksudkan untuk menjadi satu ayat. 2: Semua: Ini dimaksudkan untuk menjadi satu ayat. 

    Di sini ia menjadi jelas bagaimana ruang dapat ditafsirkan sebagai pemisah dan bukannya ruang sebenar, kecuali teks itu disebut dengan betul. Dalam hasil pertama, Ini dilihat sebagai hujah pertama, sedangkan dalam hasil kedua, seluruh kalimat dilihat sebagai hujah pertama.



  4. $ 0 - Perintah berjalan

    Setelah belajar $ 1, Seseorang boleh tertanya -tanya apa \ $ 0 Pemboleh ubah khas tidak. Sekiranya anda berfikir tentang bagaimana arahan dibentuk (Perintah Argumen1 Argumen2 dan lain-lain.), anda mungkin dapat melihat bagaimana perintah datang sebelum hujah pertama ($ 1). Perintah, dengan cara, demikian - secara visual - \ $ 0, Dan inilah yang istimewa \ $ 0 pembolehubah mengandungi; Perintah berjalan.

    $ echo \ $ 0 bash 

    Seperti yang dapat kita lihat, dan sebagai masuk akal, di baris arahan, perintah yang sedang berjalan adalah bash. Sekiranya kita menambah echo \ $ 0 Perintah ke skrip ujian ujian3.sh Dan melaksanakan perkara yang sama, kita dapat:

    $ ./test3.sh ./test3.sh $ ... /ruang kerja /test3.sh ... /ruang kerja /test3.sh 

    Seperti sekarang arahan yang sedang berjalan adalah ./test3.sh, betul -betul seperti yang dilaksanakan dari baris arahan. Sekiranya kita memulakan arahan menggunakan nama jalan yang lebih panjang seperti ... /ruang kerja /test3.sh Sekali lagi ini diulang kembali melalui yang istimewa \ $ 0 pembolehubah.

Kesimpulan

Dalam artikel ini, kami meneroka $$, $?, $ 1, $ 2, dll., $* dan \ $ 0 pembolehubah, bagaimana mereka bekerja dan bagaimana anda boleh menggunakannya sama ada secara langsung dari baris arahan atau dari dalam skrip. Terdapat beberapa pembolehubah khas lain, tetapi ini adalah pembolehubah khas utama dalam bash yang telah saya gunakan selama bertahun -tahun pengekodan bash. Nikmati!

Tutorial Linux Berkaitan:

  • Mendapatkan halaman web menggunakan Wget, Curl dan Lynx
  • Manipulasi data besar untuk keseronokan dan keuntungan bahagian 1
  • Manipulasi data besar untuk keseronokan dan keuntungan bahagian 3
  • Contoh Bash Kompleks Linux
  • Manipulasi data besar untuk keseronokan dan keuntungan bahagian 2
  • Gelung bersarang dalam skrip bash
  • Menguasai Gelung Skrip Bash
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Gelung bash dengan contoh