Pengantar Ekspansi Parameter Shell Bash
- 4954
- 272
- John Ratke
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
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