Variabel bash khusus dengan contoh

Variabel bash khusus dengan contoh

Bash adalah bahasa pengkodean yang hebat, yang memungkinkan Anda melakukan hal -hal kompleks seperti manipulasi data besar, atau sekadar membuat skrip manajemen Sever atau Desktop.

Keterampilan entry level yang diperlukan untuk menggunakan bahasa bash cukup rendah, dan skrip satu-liner (jargon yang sering digunakan, yang menunjukkan beberapa perintah yang dieksekusi di baris perintah, membentuk skrip mini), serta skrip reguler, dapat tumbuh dalam kompleksitas (dan seberapa baik tertulisnya) ketika pengembang bash belajar lebih banyak.

Belajar menggunakan variabel khusus dalam bash adalah salah satu bagian dari kurva pembelajaran ini. Sedangkan awalnya variabel khusus mungkin terlihat samar: $$, $?, $*, \ $ 0, $ 1, dll., Setelah Anda memahaminya dan menggunakannya dalam skrip Anda sendiri, hal -hal akan segera menjadi lebih jelas dan lebih mudah diingat.

Dalam tutorial ini Anda akan belajar:

  • Cara menggunakan variabel khusus dalam bash
  • Bagaimana cara mengutip variabel dengan benar, bahkan yang istimewa
  • Contoh menggunakan variabel khusus dari baris perintah dan skrip

Variabel bash khusus dengan contoh

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
  1. $$ - Tampilkan PID (Pengidentifikasi Proses)

    Dalam contoh ini, kami menggunakan variabel khusus $$ untuk menampilkan PID (Pengidentifikasi Proses) Untuk program kami saat ini. Ini berfungsi sedikit berbeda tergantung pada apakah Anda menggunakan variabel ini dari baris perintah:

    $ echo $$ 316204 $ ps -ef | grep -e "$$ | pid" uid pid ppid c stime tty time cmd roel 316204 62582 0 11:53 poin/2 00:00:00 Bash Roel 316499 316204 0 11:57 PTS/2 00:00:00 PS - EF Roel 316500 316204 0 11:57 poin/2 00:00:00 Grep -e 316204 | PID 

    Atau dari dalam skrip. Misalnya, mari kita pertimbangkan skrip berikut tes.SH:

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

    Yang, saat kami membuatnya dapat dieksekusi (tes chmod +x.SH) dan jalankan, menghasilkan:

    $ chmod +x tes.sh $ ./tes.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:00 PS -EF ROEL 316822 316820 0 12: 01 poin/2 00:00:00 grep -e 316820 | PID 

    Perbedaannya ada di Pid diproduksi! Sekilas ini mungkin masuk akal secara konseptual, tetapi mari kita jelaskan alasan utama mengapa Pid berbeda: kami menggunakan shell bash yang berbeda. Perintah pertama yang dieksekusi adalah langsung di baris perintah, dan dengan demikian spesial kami $$ variabel (yang mengidentifikasi PID dari program yang sedang berjalan) menghasilkan Pid dari shell bash yang sedang berjalan (sedang 316204).

    Dalam contoh kedua, kami menjalankan skrip dan setiap awal skrip akan selalu memulai shell bash baru. Hasilnya adalah kami Pid adalah Pid dari shell bash yang baru dimulai (316820). Kami juga dapat mengkonfirmasi ini dengan melihat PPID (Saya.e. PID TUA, atau orang tua dari pengidentifikasi proses) - dia 316204 Yang cocok dengan shell bash kami dari mana kami memulai skrip, seperti yang terlihat pada contoh pertama (contoh pertama dan kedua dieksekusi di terminal yang sama pada mesin yang sama).

    Itu grep -e Perintah dalam dua contoh kami memungkinkan kami untuk menangkap baris pertama dari daftar proses lengkap mesin (seperti yang diperoleh oleh ps -ef) dengan mengizinkan dukungan Regex yang diperluas dan Grepping untuk Pid selain kami Pid (dengan menggunakan $$). Itu | adalah pemisah ekspresi reguler yang diperluas yang memungkinkan penangkapan ganda ini.

    Untuk informasi lebih lanjut tentang ekspresi reguler, silakan lihat Bash Regexps kami untuk pemula dengan contoh dan lanjutan Bash Regex dengan contoh artikel.

    Perhatikan juga bahwa kami telah mengotomatiskan penangkapan PID dengan menggunakan $$ dalam grep memerintah. Ini $$ Variabel tidak pernah berubah kecuali shell / subshell bash baru dimulai, seperti yang dapat kita lihat dalam contoh berikut:

    $ echo $$ 316204 $ BASH $ ECHO $$ 318023 $ ECHO $ ​​PPID 316204 

    Itu Pid dari cangkang bash utama kami masih 316204 seperti sebelumnya. Selanjutnya, kami memulai subshell baru dan Pid dari cangkang baru ini 318023 Saat diperiksa. Dan, menggunakan variabel setel otomatis (dengan bash) $ Ppid Kami dapat mengkonfirmasi PPID (ID Proses Induk) dari shell/subshell bash sekunder sebagai 316204, yang cocok dengan cangkang utama kami. Seperti yang Anda lihat, dalam hal manajemen proses dan secara khusus $$ variabel, tidak ada banyak perbedaan antara memulai skrip dan subshell baru.

    Untuk informasi lebih lanjut tentang manajemen proses bash, Anda mungkin ingin memeriksa manajemen proses latar belakang bash dan manajemen daftar proses dan artikel penghentian proses otomatis.



  2. $? - Kode Keluar

    Itu $? Variabel memberi tahu kami apa Kode Keluar adalah perintah sebelumnya. Mengetahui Kode Keluar dari pernyataan yang dieksekusi memungkinkan kami untuk melanjutkan skrip dalam dua atau lebih arah yang berbeda. Misalnya, jika kami memulai a rm Perintah (untuk menghapus beberapa file) dari dalam suatu program, kami mungkin ingin memeriksa apakah proses tersebut berhasil diselesaikan.

    Jika Kode Keluar adalah 0, Secara umum (baca: hampir selalu) berarti bahwa suatu proses diakhiri dengan sukses. Jika bagaimanapun Kode Keluar adalah 1 (atau lebih) sering (meskipun tidak selalu) berarti bahwa proses diakhiri dengan kesalahan atau hasil negatif, misalnya file tidak dapat dihapus dalam contoh kami. Mari kita lihat bagaimana ini bekerja di baris perintah, mengingat bahwa kerja variabel ini dari dalam skrip adalah identik.

    $ sentuh ini.ada $ rm ini.ada $ echo $? 0 $ rm ini.melakukan.bukan.ada rm: tidak dapat menghapus 'ini.melakukan.bukan.ada ': tidak ada file atau direktori seperti itu $ echo $? 1 

    Kami pertama -tama membuat file ini.ada dengan menggunakan menyentuh memerintah. menyentuh Cukup buat file nol ukuran tanpa menulis apa pun untuk itu. Selanjutnya kami menghapus file menggunakan rm ini.ada dan menampilkan $? Kode keluar menggunakan gema. Hasilnya adalah 0 karena perintah berhasil seperti yang diantisipasi dan dilihat dengan tidak ada kesalahan yang dikembalikan.

    Selanjutnya, kami mencoba dan menghapus file yang tidak ada dan menerima kesalahan. Saat kita memeriksa kode keluar itu memang 1 menunjukkan beberapa kesalahan terjadi. Kita dapat memeriksa nilai variabel ini dengan mudah dari baris perintah atau dari dalam skrip dengan menggunakan Jika [$? -eq 0]; Kemudian atau pernyataan bersyarat serupa (diakhiri oleh fi).

    Untuk mempelajari lebih lanjut tentang jika pernyataan berbasis, silakan lihat bash jika pernyataan jika elif lagi maka fi. Menggabungkan $? dengan jika Pernyataan adalah hal yang umum dan kuat untuk mengotomatiskan berbagai hal dalam bash.

  3. $ 1, $ 2, ... $* - Argumen yang lewat

    Ketika kita memulai skrip di baris perintah bash, kita dapat meneruskan argumen ke tempat yang sama. Sepenuhnya tergantung pada skrip untuk menangani argumen yang diteruskan ke sana. Jika skrip misalnya tidak ada penanganan argumen sama sekali (default), maka tidak ada konsekuensi untuk menentukan atau tidak menentukan variabel apa pun, atau banyak, ke skrip.

    Kami dapat menangani argumen yang disahkan dengan menggunakan variabel khusus $ 1, $ 2, $* dll. Argumen pertama yang diteruskan ke skrip akan selalu $ 1, Argumen kedua akan selalu $ 2 dll. Satu hal yang harus diperhatikan adalah jika Anda memperkenalkan ruang dalam klien bash yang dikonfigurasi default, maka Bash akan menafsirkan ruang itu sebagai pemisah.

    Jika Anda mencoba lulus beberapa teks seperti misalnya Ini adalah contohnya Anda perlu mengutipnya dengan benar seperti ini: "Ini adalah contoh"; Agar Bash dapat melihat teks itu sebagai variabel tunggal yang dilewati.



    Yang spesial $* Variabel adalah steno untuk menulis semua variabel menjadi satu string. Mari kita lihat bagaimana ini bekerja dengan mendefinisikan yang baru test2.SH skrip sebagai berikut:

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

    Sebagai sedikit variasi, kami memilih untuk mendefinisikan variabel kami di sini sebagai $ 1 ke $ * alih-alih $ 1 ke $*. Faktanya, akan menjadi ide yang baik untuk selalu mengutip variabel dengan cara ini. Untuk informasi lebih lanjut, silakan lihat parsing variabel kami yang benar dan mengutip dalam artikel Bash.

    Ketika kami menjalankan hal yang sama, menggunakan dua atau tiga argumen, kami melihat:

    $ 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 diakui dengan benar sebagai $ 1 dll. Juga, kami perhatikan bahwa argumen ketiga sepenuhnya diabaikan oleh naskah sampai mencapai echo "all: $ *" instruksi yang memang menunjukkan semua argumen seperti yang dibahas sebelumnya. Sekarang mari kita jelajahi input yang salah tanpa mengutip:

    $ ./test2.SH ini dimaksudkan untuk menjadi satu kalimat. 1: ini 2: adalah semua: ini dimaksudkan untuk menjadi satu kalimat. $ ./test2.SH "Ini dimaksudkan untuk menjadi satu kalimat."1: Ini dimaksudkan untuk menjadi satu kalimat. 2: Semua: Ini dimaksudkan untuk menjadi satu kalimat. 

    Di sini menjadi jelas bagaimana suatu ruang dapat diartikan sebagai pemisah, bukan ruang yang sebenarnya, kecuali jika teks tersebut dikutip dengan benar. Pada hasil pertama, Ini dilihat sebagai argumen pertama, sedangkan pada hasil kedua, seluruh kalimat dipandang sebagai argumen pertama.



  4. $ 0 - perintah berjalan

    Telah belajar tentang $ 1, orang bisa bertanya -tanya apa \ $ 0 variabel khusus tidak. Jika Anda berpikir tentang bagaimana sebuah perintah dibentuk (Command Argument1 Argument2 dll.), Anda mungkin memperhatikan caranya memerintah datang sebelum argumen pertama ($ 1). Perintah, dengan cara tertentu, dengan demikian - secara visual - \ $ 0, Dan inilah yang istimewa \ $ 0 Variabel berisi; perintah berjalan.

    $ echo \ $ 0 bash 

    Seperti yang bisa kita lihat, dan masuk akal, di baris perintah, perintah yang sedang berjalan adalah pesta. Jika kami menambahkan echo \ $ 0 Perintah ke skrip tes test3.SH dan menjalankan hal yang sama, kami mendapatkan:

    $ ./test3.SH ./test3.SH $… /Workspace /Test3.sh… /workspace /test3.SH 

    Seperti sekarang perintah yang sedang berjalan adalah ./test3.SH, persis seperti yang dieksekusi dari baris perintah. Jika kita memulai perintah menggunakan nama jalur yang lebih panjang seperti … /Workspace /Test3.SH sekali lagi ini diulang kembali melalui spesial \ $ 0 variabel.

Kesimpulan

Dalam artikel ini, kami menjelajahi $$, $?, $ 1, $ 2, dll., $* Dan \ $ 0 variabel, cara kerjanya dan bagaimana Anda dapat menggunakannya baik secara langsung dari baris perintah atau dari dalam skrip. Ada beberapa variabel khusus lainnya, tetapi ini adalah variabel khusus utama dalam bash yang telah saya gunakan selama bertahun -tahun dengan pengkodean bash. Menikmati!

Tutorial Linux Terkait:

  • Mengambil halaman web menggunakan wget, curl dan lynx
  • Manipulasi data besar untuk kesenangan dan keuntungan bagian 1
  • Manipulasi data besar untuk kesenangan dan keuntungan bagian 3
  • Linux Complex Bash One-Liner Contoh
  • Manipulasi data besar untuk kesenangan dan keuntungan bagian 2
  • Loop bersarang dalam skrip bash
  • Menguasai loop skrip bash
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
  • Loop bash dengan contoh