Як працюють $ {0 ## * /} та $ {0% / *}?


33

Я дуже розгублений щодо таких регулярних виразів, які я знайшов у сценарії оболонки:

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

Як вони працюють?

Відповіді:


38

Це не регулярні вирази, це приклади розширення параметра Баша: підміна змінної або спеціального параметра його значенням. У Wooledge Wiki є гарне пояснення .

В основному, у прикладі, який ви маєте, ${0##*/}перекладається як:

для змінної $ 0 і шаблону '/' два хеша означають з початку параметра, видаляють найдовший (або жадібний) збіг - до і включаючи шаблон.

Отже, звідки $0ім'я файлу, напр. $HOME/documents/doc.txt,, Параметр буде розгорнуто як:doc.txt

Аналогічно, для ${0%/*}, шаблон /узгоджується з кінцем параметра (the %), при цьому видаляється найкоротше або не жадне збіг - що у наведеному вище прикладі дасть вам $HOME/documents.

Дивіться також статтю у Вікі Баша Хакера .


2
Отже ... вони не хотіли користуватися basenameі dirname? : D
Аарон Д. Мараско

8
Однією з переваг є те, що підстановка параметрів не породжує підпроцес ...
Jasonwryan

@ jasonwryan, чи можете ви детальніше розробити функціонал * у вищевказаних двох прикладах? Або навіщо нам туди класти * Зокрема, у першому прикладі * розміщується перед //; тоді як у другому прикладі * розміщується після /. У чому полягає основна різниця? Спасибі.
користувач785099

3
Глобус ( *) вказує на те, що все, що стосується шаблону, буде включено. Отже, для початку параметра, #він знаходиться зліва та в кінці %, працюючи в інший бік справа.
Jasonwryan

5
Це не специфічно для bash, це визначено POSIX sh.
nyuszika7h
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.