2016-09-12 6 views
2

я думал, что я понял, использование дополнительного ?(pattern-list) в bash (когда extglob вариант оболочки включен) и по умолчанию в ksh. Например, в bash:Как extglob работает с расширением параметра оболочки?

$ shopt -s extglob 
$ V=35xAB 
$ echo "${V#?(35|88)x}" "${V#35}" 
AB xAB 

Но когда соответствующий префикс шаблон только один ?() или один *(), вводящие то, что я называю дополнительные шаблоны, то 35 не опускается, если ## не используется:

$ echo "${V#?(35|88)}" "${V#*(35|88)}" # Why 35 is not left out? 
35xA 35xA 
$ echo "${V##?(35|88)}" "${V##*(35|88)}" # Why is it omitted when ## is used? 
xA xA 

Такое же поведение, как сообщается, когда ?()и 0 используются в согласующего суффиксом шаблона (с использованием % и %%):

$ echo "${V%5?(xA|Bz)}"     # 5xA is omitted 
3 
$ echo "${V%?(xA|Bz)}" "${V%*(xA|Bz)}" # why xA is not left out? 
35xA 35xA 
$ echo "${V%%?(xA|Bz)}" "${V%%*(xA|Bz)}" # xA is omitted when %% is used 
35 35 

Я проверил этот вопрос в bash релизах 3.2.25, 4.1.2 и 4.1.6, и это заставляет меня думать, что, возможно, я неправильно понял реальный механизм оболочки для сопоставления шаблонов.

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

Заранее спасибо

+1

'' # соответствует кратчайшему возникновение рисунка. '?()' соответствует нулю или одному вхождению и '*()' ноль или больше шаблона. Поэтому '#' будет соответствовать 0 и ничего не делать. То же самое с '%'. Попробуйте с помощью '+()', и он должен работать так, как ожидалось. – 123

+0

@ 123, почему вы изменили название этого вопроса? Опция 'extglob' не существует' ksh'. – Jdamian

+1

ваш не имеет смысла.ksh по-прежнему использует extendedglob, даже если опция не существует. – 123

ответ

1

Если вы используете @ вместо ? то он работает, как ожидалось:

$> echo "${V#@(35|88)}" 
xAB 

$> echo "${V%@(xAB|Bzh)}" 
35 

Аналогично поведение + вместо *:

$> echo "${V#*(35|88)}" 
35xAB 

$>echo "${V#+(35|88)}" 
xAB 

Это происходит потому, что:

  • ?(pattern-list) # Матчи нулевой или одно вхождение указанных шаблонов
  • @(pattern-list) # Спички один из указанных шаблонов

И:

  • *(pattern-list) # Спички нулевой или больше вхождений данных моделей
  • +(pattern-list) # Соответствует один или более вхождений указанных шаблонов
+2

Я думаю, что ключевая часть здесь заключается в том, что '#' будет использовать кратчайшее возможное совпадение, которое в этих случаях равно 0 вхождениям. – 123

+0

Правильный '#' действительно соответствует кратчайшему совпадению, но изменению поведения, когда мы используем '@' вместо '?' В 'extglob'. – anubhava

+0

Поведение не меняется, оно по-прежнему соответствует кратчайшему совпадению. Просто для '@' требуется хотя бы одно вхождение. – 123