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

33

Saya cukup bingung tentang ekspresi reguler berikut yang saya temukan di skrip shell:

${0##*/}
${0%/*}

Bagaimana mereka bekerja?

pengguna785099
sumber

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 .

jasonwryan
sumber
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