я думал, что я понял, использование дополнительного ?(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, и это заставляет меня думать, что, возможно, я неправильно понял реальный механизм оболочки для сопоставления шаблонов.
Может кто-нибудь пролить свет на это?
Заранее спасибо
'' # соответствует кратчайшему возникновение рисунка. '?()' соответствует нулю или одному вхождению и '*()' ноль или больше шаблона. Поэтому '#' будет соответствовать 0 и ничего не делать. То же самое с '%'. Попробуйте с помощью '+()', и он должен работать так, как ожидалось. – 123
@ 123, почему вы изменили название этого вопроса? Опция 'extglob' не существует' ksh'. – Jdamian
ваш не имеет смысла.ksh по-прежнему использует extendedglob, даже если опция не существует. – 123