Pengantar Ekspansi Parameter Shell Bash

Pengantar Ekspansi Parameter Shell Bash

Shell adalah bagian penting dari sistem operasi berbasis UNIX dan merupakan antarmuka utama yang dapat kita gunakan untuk berinteraksi dengan sistem itu sendiri. Bash tanpa diragukan lagi shell yang paling banyak digunakan pada sebagian besar distribusi Linux: itu lahir sebagai pengganti perangkat lunak bebas untuk Bourne Shell (Bash adalah akronim untuk Bourne-Again Shell) di dalam proyek GNU. Dalam tutorial ini kita akan belajar bagaimana beberapa ekspansi bash paling berguna bekerja.

Jika Anda belum terbiasa dengan Bash, atau Anda hanya perlu menyegarkan ingatan Anda, maka Anda disarankan untuk mengunjungi tutorial skrip Bash kami untuk pemula, sebelum Anda menyelami konsep ekspansi Bash Shell di bawah ini.

Dalam tutorial ini Anda akan belajar:

  • Cara menggunakan berbagai ekspansi parameter bash



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-independen
Perangkat lunak Cangkang bash
Lainnya Pengetahuan Dasar tentang Bash
Konvensi # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa

Ekspansi paling sederhana

Sintaks ekspansi parameter paling sederhana adalah sebagai berikut:

$ parameter

Saat kami menggunakan sintaks ini, parameter diganti dengan nilainya. Mari kita lihat contoh:

$ situs = "linuxconfig.org "$ echo" $ situs "linuxconfig.org

Kami menciptakan lokasi variabel dan ditugaskan "LinuxConfig.org " string untuk itu. Kami kemudian menggunakan gema Perintah untuk menampilkan hasil ekspansi variabel. Menjadi ini adalah ekspansi dasar, itu akan berhasil bahkan tanpa menggunakan kurung kurawal di sekitar nama variabel:

$ echo "$ situs" linuxconfig.org


Mengapa kami menggunakan kurung kurawal Kemudian? Kawat gigi keriting, saat melakukan ekspansi parameter, digunakan untuk membatasi nama variabel:

$ echo "Anda membaca artikel ini di $ SITED_!"Anda sedang membaca artikel ini tentang

Apa yang telah terjadi? Karena nama variabel tidak dibatasi, _ karakter dianggap sebagai bagian darinya. Shell mencoba untuk memperluas kemudian ada $ situs_ variabel, oleh karena itu tidak ada yang dikembalikan. Membungkus variabel dengan kawat gigi keriting memecahkan masalah ini:

$ echo "Anda sedang membaca artikel ini di $ situs _!"Anda sedang membaca artikel ini di LinuxConfig_!

Sementara penggunaan kawat gigi keriting tidak selalu diperlukan dengan ekspansi parameter dasar, wajib untuk melakukan semua ekspansi lain yang akan kita lihat dalam artikel ini.

Sebelum melangkah lebih jauh, izinkan saya memberi Anda satu tip. Dalam contoh di atas shell mencoba memperluas variabel yang tidak ada, menghasilkan hasil kosong. Ini bisa sangat berbahaya, terutama ketika bekerja dengan nama jalur, oleh karena itu, saat menulis skrip, selalu disarankan untuk menggunakan nounset Opsi yang menyebabkan shell keluar dengan kesalahan setiap kali variabel yang tidak ada dirujuk:

$ set -o nounset $ echo "Anda membaca artikel ini di $ SITED_!"Bash: Site_: Variabel Tidak Terbatas

Bekerja dengan tipuan

Penggunaan $ !parameter Sintaks, menambahkan tingkat pengutil ke dalam ekspansi parameter kami. Apa artinya? Parameter yang akan coba diperluas oleh shell parameter ; Sebaliknya itu akan mencoba menggunakan nilai parameter sebagai nama variabel yang akan diperluas. Mari kita jelaskan ini dengan contoh. Kita semua tahu RUMAH Variabel berkembang di jalur direktori home pengguna di sistem, benar?

$ echo "$ home" /home /egdoc

Sangat baik, jika sekarang kami menetapkan string "rumah", ke variabel lain, dan menggunakan jenis ekspansi ini, kami dapatkan:

$ variable_to_inspect = "home" $ ​​echo "$ !variable_to_inspect " /home /egdoc

Seperti yang dapat Anda lihat pada contoh di atas, alih -alih mendapatkan "rumah" sebagai hasilnya, seperti yang akan terjadi jika kami melakukan ekspansi sederhana, shell menggunakan nilai dari variable_to_inspect Sebagai nama variabel yang akan diperluas, itulah sebabnya kami berbicara tentang tingkat pengutut.

Ekspansi Modifikasi Kasus

Sintaks Ekspansi Parameter Ini Mari kita ubah kasus karakter alfabet di dalam string yang dihasilkan dari perluasan parameter. Katakanlah kami memiliki variabel yang disebut nama; untuk memanfaatkan teks yang dikembalikan oleh perluasan variabel yang akan kami gunakan $ parameter^ sintaksis:

$ name = "egidio" $ echo "$ name^" egidio

Bagaimana jika kita ingin meningkatkan seluruh string, alih -alih memanfaatkannya? Mudah! kami menggunakan $ parameter ^^ sintaksis:

$ echo "$ name ^^" egidio

Demikian pula, untuk mengurangi karakter pertama dari suatu string, kami menggunakan $ parameter, Sintaks Ekspansi:

$ name = "egidio" $ echo "$ name," egidio

Untuk mengurangi seluruh string, sebagai gantinya, kami menggunakan $ parameter ,, sintaksis:

$ name = "egidio" $ echo "$ name ,," egidio

Dalam semua kasus a pola untuk mencocokkan satu karakter juga dapat disediakan. Ketika pola disediakan, operasi hanya diterapkan pada bagian -bagian dari string asli yang cocok dengan itu:

$ name = "egidio" $ echo "$ name ,, [dio]" egidio


Dalam contoh di atas kami melampirkan karakter dalam tanda kurung persegi: ini menyebabkan siapa pun dari mereka dicocokkan sebagai pola.

Saat menggunakan ekspansi yang kami jelaskan dalam paragraf ini dan parameter adalah array yang diterjemahkan oleh @ atau *, Operasi diterapkan pada semua elemen yang terkandung di dalamnya:

$ my_array = (satu dua tiga) $ echo "$ my_array [@] ^^" satu dua tiga

Ketika indeks elemen tertentu dalam array dirujuk, sebagai gantinya, operasi hanya diterapkan untuk itu:

$ my_array = (satu dua tiga) $ echo "$ my_array [2] ^^" tiga

Penghapusan Substring

Sintaks berikutnya yang akan kami periksa memungkinkan kami untuk menghapus a pola dari awal atau dari akhir string yang dihasilkan dari perluasan parameter.

Hapus pola pencocokan dari awal string

Sintaks berikutnya yang akan kita periksa, $ parameter#pola, memungkinkan kami untuk menghapus a pola dari awal dari
string yang dihasilkan dari parameter ekspansi:

$ name = "egidio" $ echo "$ name#ei" Dio

Hasil serupa dapat diperoleh dengan menggunakan "$ parameter ## pola" sintaks, tetapi dengan satu perbedaan penting: bertentangan dengan yang kami gunakan dalam contoh di atas, yang menghapus Pola pencocokan terpendek Dari awal string, ia menghapus terpanjang satu. Perbedaannya terlihat jelas saat menggunakan * karakter di pola:

$ name = "egidio damil" $ echo "$ name#*i" dio Docile

Dalam contoh di atas yang kami gunakan * sebagai bagian dari pola yang harus dihapus dari string yang dihasilkan oleh perluasan nama variabel. Ini Wildcard cocok dengan karakter apa pun, jadi pola itu sendiri diterjemahkan dalam karakter “'i' dan segalanya sebelum itu”. Seperti yang sudah kami katakan, saat kami menggunakan $ parameter#pola Sintaks, pola pencocokan terpendek dihapus, dalam hal ini adalah "EGI". Mari kita lihat apa yang terjadi saat kita menggunakan "$ parameter ## pola" Sintaks sebagai gantinya:

$ name = "egidio damil" $ echo "$ name ##*i" le

Kali ini pola pencocokan terpanjang dihapus ("Egidio doci"): Pertandingan terpanjang termasuk yang ketiga 'dan semuanya sebelum itu. Hasil ekspansi hanyalah "le".

Hapus pola pencocokan dari ujung string

Sintaks yang kami lihat di atas lepaskan pola pencocokan terpendek atau terpanjang dari awal string. Jika kita ingin polanya dihapus dari akhir dari string, sebaliknya, kita harus menggunakan $ parameter%pola atau $ parameter %% pola Ekspansi, untuk menghapus, masing -masing, kecocokan terpendek dan terpanjang dari ujung string:

$ name = "egidio damil" $ echo "$ name%i*" egidio doc

Dalam contoh ini pola yang kami berikan secara kasar diterjemahkan dalam karakter “'i' dan segala sesuatu setelah itu mulai dari akhir string”. Pertandingan terpendek adalah "ile", jadi yang dikembalikan adalah "egidio doc". Jika kami mencoba contoh yang sama tetapi kami menggunakan sintaks yang menghilangkan kecocokan terpanjang yang kami peroleh:

$ name = "egidio damil" $ echo "$ name %% i*" misalnya

Dalam hal ini pertandingan yang pernah terlama dihapus, yang dikembalikan adalah "misalnya".

Dalam semua ekspansi yang kami lihat di atas, jika parameter adalah array dan berlangganan * atau @, Penghapusan pola pencocokan diterapkan pada semua elemennya:

$ my_array = (satu dua tiga) $ echo "$ my_array [@]#*o" ne tiga


Cari dan ganti pola

Kami menggunakan sintaks sebelumnya untuk menghapus pola pencocokan dari awal atau dari akhir string yang dihasilkan dari perluasan parameter. Bagaimana jika kita mau mengganti pola dengan sesuatu yang lain? Kita bisa menggunakan $ parameter/pola/string atau $ parameter // pola/string sintaksis. Yang pertama hanya menggantikan kejadian pertama dari pola, yang terakhir semua kejadian:

$ frase = "kuning adalah matahari dan kuning adalah lemon" $ echo "$ frase/kuning/merah" merah adalah matahari dan kuning adalah lemon

Itu parameter (frasa) diperluas, dan kecocokan terpanjang dari pola (kuning) dicocokkan dengan itu. Pertandingan kemudian digantikan oleh yang disediakan rangkaian (merah). Karena Anda hanya dapat mengamati kejadian pertama diganti, jadi lemon tetap kuning! Jika kita ingin mengubah semua kemunculan pola, kita harus mengawalinya dengan / karakter:

$ frase = "kuning adalah matahari dan kuning adalah lemon" $ echo "$ frase // kuning/merah" merah adalah matahari dan merah adalah lemon

Kali ini semua kejadian "kuning" telah digantikan oleh "merah". Seperti yang Anda lihat polanya cocok di mana pun ditemukan dalam string yang dihasilkan dari perluasan parameter. Jika kita ingin menentukan bahwa itu harus dicocokkan hanya di awal atau di akhir string, kita harus awalan masing -masing dengan # atau % karakter.

Sama seperti dalam kasus sebelumnya, jika parameter adalah array yang dikeluarkan oleh keduanya * atau @, Substitusi terjadi di masing -masing elemennya:

$ my_array = (satu dua tiga) $ echo "$ my_array [@]/o/u" une twu tiga

Ekspansi substring

Itu $ parameter: offset Dan $ parameter: offset: length Ekspansi Mari kita perluas hanya sebagian dari parameter, mengembalikan substring mulai dari yang ditentukan mengimbangi Dan panjang karakter panjang. Jika panjangnya tidak ditentukan, ekspansi berlangsung sampai akhir string asli. Jenis ekspansi ini disebut ekspansi substring:

$ name = "egidio damil" $ echo "$ name: 3" dio Docile

Dalam contoh di atas kami memberikan hanya mengimbangi, tanpa menentukan panjang, Oleh karena itu hasil ekspansi adalah substring yang diperoleh dengan memulai karakter yang ditentukan oleh offset (3).

Jika kami menentukan panjang, substring akan dimulai mengimbangi dan akan menjadi panjang Karakter Panjang:

$ echo "$ name: 3: 3" DIO 

Jika mengimbangi negatif, dihitung dari ujung string. Dalam hal ini ruang tambahan harus ditambahkan setelahnya : jika tidak, shell akan menganggapnya sebagai jenis ekspansi lain yang diidentifikasi oleh :- yang digunakan untuk memberikan nilai default jika parameter yang akan diperluas tidak ada (kami membicarakannya dalam artikel tentang mengelola perluasan variabel bash kosong atau tidak disetel):

$ echo "$ name: -6" Dipile

Jika disediakan panjang negatif, alih -alih ditafsirkan sebagai jumlah total karakter string yang dihasilkan harus panjang, dianggap sebagai offset untuk dihitung dari ujung string. Oleh karena itu hasil ekspansi akan menjadi substring mulai mengimbangi dan berakhir di panjang Karakter dari akhir string asli:

$ echo "$ name: 7: -3" doc 

Saat menggunakan ekspansi ini dan parameter adalah array yang diindeks berlangganan oleh * atau @, itu mengimbangi relatif terhadap indeks elemen array. Misalnya:

$ my_array = (satu dua tiga) $ echo "$ my_array [@]: 0: 2" satu dua $ echo "$ my_array [@]: -2" dua tiga


Negatif panjang , Sebaliknya, menghasilkan kesalahan ekspansi:

$ echo "$ my_array [@]: 0: -2" bash: -2: ekspresi substring < 0 

Ekspansi "Panjang"

Saat menggunakan $ #parameter Ekspansi, hasil ekspansi bukanlah nilai parameter, dengan panjangnya:

$ name = "egidio" $ echo "$ #name" 6

Kapan parameter adalah array, dan itu berlangganan * atau @, Jumlah elemen yang terkandung di dalamnya dikembalikan:

$ my_array = (satu dua tiga) echo "$ #my_array [@]" 3

Ketika elemen spesifik dari array direferensikan, panjangnya dikembalikan sebagai gantinya:

$ echo "$ #my_array [2]" 5

Menyatukan semuanya

Dalam artikel ini kami melihat banyak sintaks ekspansi. Kami melihat cara merendahkan atau meningkatkan huruf pertama dari string yang dihasilkan dari perluasan variabel, cara menggunakan tingkat tidak langsung, cara melakukan penghapusan substring dan ekspansi substring, cara mengganti pola dengan string yang disediakan dan bagaimana caranya Buat parameter diperluas seiring dengan panjang nilainya, bukan nilainya sendiri.

Ini bukan daftar lengkap dari semua ekspansi yang mungkin kami lakukan dengan bash: Konsultasikan dengan dokumentasi GNU jika Anda ingin tahu lebih banyak. Dalam artikel kami juga menyebutkan array bash: Untuk mengetahui lebih banyak tentang mereka, Anda dapat membaca artikel array bash khusus kami.

Tutorial Linux Terkait:

  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Sistem Linux Hung? Cara melarikan diri ke baris perintah dan…
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 22.04 Jammy Jellyfish…
  • Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
  • Ubuntu 20.04 Panduan
  • Hal -hal yang harus diinstal pada Ubuntu 22.04
  • Instal Arch Linux di VMware Workstation
  • Unduh Linux