$ {0 ## * /} ve $ {0% / *} nasıl çalışır?


33

Bir kabuk betiğinde bulduğum aşağıdaki normal ifadeler konusunda kafam oldukça karıştı:

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

Nasıl çalışıyorlar?

Yanıtlar:


38

Bunlar normal ifadeler değil, Bash'in parametre genişlemesinin örnekleridir: bir değişkenin veya özel bir parametrenin değeri ile değiştirilmesi. Wooledge Wiki'nin iyi bir açıklaması var .

Temel olarak, sahip olduğunuz örnekte şöyle ${0##*/}çevirir:

$ 0 değişkeni ve '/' kalıbı için, iki karma parametrenin başlangıcından itibaren , kalıba kadar ve kalıbı içeren en uzun (veya açgözlü) eşleşmeyi silin.

Öyleyse, $0bir dosyanın adı nerede , örneğin. $HOME/documents/doc.txt, Sonra parametre şöyle genişletilir:doc.txt

Buna benzer şekilde, ${0%/*}desen /ile eşleştirilir parametresinin ( %), en kısa ya da olmayan hırslı eşlemeyle silinmiş - Örnek olarak vermek olacaktır ki yukarıda $HOME/documents.

Bash Hacker'in Wiki'sindeki makaleye de bakın .


2
Yani ... kullanmak istemediler basenameve dirname? : D
Aaron D. Marasco

8
Bunun bir avantajı, susbstitution parametresinin bir alt işlemi ortaya
çıkarmamasıdır

@ jasonwryan, yukarıdaki iki örnekte * fonksiyonelliğini detaylandırabilir misiniz? Ya da neden oraya * koymalıyız. Spesifik olarak, ilk örnekte *, //; İkinci örnekte ise * işaretinin arkasına * yerleştirilir. Temel fark nedir? Teşekkürler.
user785099,

3
Glob ( *), desene kadar ve desenin dahil olduğu her şeyin silineceğini gösterir. Bu nedenle, parametrenin başlangıcı için , sağdan diğer tarafa çalışan #solda ve %sondadır.
jasonwryan

5
Bash'a özgü değil, POSIX tarafından belirtildish .
nyuszika7h
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.