Bagaimana cara kerja $ {0 ## * /} dan $ {0% / *}?


Jawaban:


38

Itu bukan ekspresi reguler, itu adalah contoh ekspansi parameter Bash: penggantian variabel atau parameter khusus berdasarkan nilainya. The Wooledge Wiki memiliki penjelasan yang bagus .

Pada dasarnya, dalam contoh yang Anda miliki, ${0##*/}diterjemahkan sebagai:

untuk variabel $ 0, dan pola '/', dua hash rata-rata dari awal parameter, hapus kecocokan terpanjang (atau serakah) —sampai dan termasuk pola.

Jadi, di mana $0nama file, mis. $HOME/documents/doc.txt,, Maka parameter akan diperluas sebagai:doc.txt

Demikian pula, untuk ${0%/*}, pola /dicocokkan dengan akhir parameter (the %), dengan kecocokan terpendek atau tidak serakah dihapus - yang dalam contoh di atas akan memberi Anda $HOME/documents.

Lihat juga artikel di Wiki Bash Hacker .


2
Jadi ... mereka tidak mau menggunakan basenamedan dirname? : D
Aaron D. Marasco

8
Satu keuntungan adalah bahwa susbstitusi parameter tidak menghasilkan subproses ...
jasonwryan

@ jasonwryan, dapatkah Anda menguraikan fungsi * dalam dua contoh di atas? Atau mengapa kita harus meletakkan * di sana. Khususnya, pada contoh pertama, * ditempatkan sebelum //; sedangkan pada contoh kedua, * ditempatkan setelah /. Apa perbedaan mendasarnya? Terima kasih.
user785099

3
Glob ( *) menunjukkan bahwa semuanya hingga dan termasuk pola akan dihapus. Oleh karena itu, untuk awal parameter,, #ada di sebelah kiri dan di ujung %, bekerja sebaliknya dari kanan.
jasonwryan

5
Ini bukan spesifik bash, ini ditentukan oleh POSIX sh.
nyuszika7h
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.