Как работают $ {0 ## * /} и $ {0% / *}?

33

Я очень озадачен следующими регулярными выражениями, которые я нашел в сценарии оболочки:

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

Как они работают?

user785099
источник

Ответы:

38

Это не регулярные выражения, это примеры расширения параметров Bash: подстановка переменной или специального параметра ее значением. Wooledge Wiki имеет хорошее объяснение .

По сути, в приведенном вами примере это ${0##*/}выглядит так:

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

Итак, где $0имя файла, например $HOME/documents/doc.txt, тогда параметр будет расширен как:doc.txt

Точно так же, для ${0%/*}, образец /сопоставляется с концом параметра ( %), с самым коротким или не жадным соответствием, удаленным - что в приведенном выше примере даст вам $HOME/documents.

Смотрите также статью в Bash Hacker's Wiki .

jasonwryan
источник
2
Итак ... они не хотели использовать basenameи dirname? : D
Аарон Д. Мараско
8
Одним из преимуществ является то, что параметр susbstitution не порождает подпроцесс ...
jasonwryan
@ jasonwryan, можете ли вы описать функциональность * в двух приведенных выше примерах? Или почему мы должны поставить * там. В частности, в первом примере * ставится перед //; в то время как во втором примере * ставится после /. В чем основная разница? Спасибо.
user785099
3
Glob ( *) указывает, что все, включая шаблон, будут удалены. Следовательно, для начала параметра, #он слева и в конце %, работает наоборот справа.
Джейсонвриан
5
Это не специфично для bash, это указано в POSIX sh.
nyuszika7h