Что означает синтаксис $ {0 ## ...} с переменной, фигурными скобками и хеш-символом в bash? - PullRequest
36 голосов
/ 13 января 2010

Я только что увидел некоторый код в bash, который я не совсем понял. Будучи сценаристом новичка Bash, я не уверен, что происходит.

echo ${0##/*}
echo ${0}

Я действительно не вижу разницы в выводе в этих двух командах (печатает имя скрипта). Это # просто комментарий? А что с /*. Если это комментарий, почему он не мешает закрывающей скобке }?

Кто-нибудь может дать мне некоторое представление об этом синтаксисе?

Ответы [ 3 ]

46 голосов
/ 13 января 2010

См. Раздел Удаление подстроки в Расширенном руководстве по написанию сценариев ‡:

${string#substring}

Удаляет самое короткое совпадение substring с фронта $string.

${string##substring}

Удаляет самый длинный матч substring с фронта $string.

Подстрока может содержать подстановочный знак *, соответствующий всему. Выражение ${0##/*} печатает значение $0, если оно не начинается с косой черты, в этом случае оно ничего не печатает.

‡ В руководстве по состоянию на 03.03.2009 ошибочно утверждается, что совпадение имеет значение $substring, как если бы substring было именем переменной. Это не так: substring это просто шаблон.

22 голосов
/ 13 января 2010

Совет для Linux: параметры Bash и расширения параметров

${PARAMETER##WORD}  Results in removal of the longest matching pattern from the beginning rather than the shortest.
for example
[ian@pinguino ~]$ x="a1 b1 c2 d2"
[ian@pinguino ~]$ echo ${x#*1}
b1 c2 d2
[ian@pinguino ~]$ echo ${x##*1}
c2 d2
[ian@pinguino ~]$ echo ${x%1*}
a1 b
[ian@pinguino ~]$ echo ${x%%1*}
a
[ian@pinguino ~]$ echo ${x/1/3}
a3 b1 c2 d2
[ian@pinguino ~]$ echo ${x//1/3}
a3 b3 c2 d2
[ian@pinguino ~]$ echo ${x//?1/z3}
z3 z3 c2 d2
0 голосов
/ 13 января 2010

См. Раздел Parameter Expansion справочной страницы bash(1).

...