Поскольку ЗШ пытается выбрать «значение s буквально (простая текстовая строка) в этом случае:
a=('*(a|b)' fooa foob)
p="*(a|b)"
b=(${(M)a:#$p})
print ${(qq)b}
;#⇒'*(a|b)'
Мы могли бы сказать, ЗШ для лечения $p
» $p
с расширением в виде образцов, а не буквальных значений явно ${~spec}
вид.
$ {~} спецификации
Включите GLOB_SUBST
вариант для оценки спецификации; если «~
» удваивается, выключите его. Когда этот параметр установлен, строка, возникающая в результате расширения, будет интерпретироваться как шаблон в любом месте, где это возможно, например, в расширении имени файла и создании имен файлов и контекстов сопоставления шаблонов, таких как правая сторона «=
» и «!=
», операторов в условиях.
- zshexpn(1): Expansion, Parameter Expansion
В этом случае, мы могли бы использовать его как это:
a=(fooa foob foox)
p="*(a|b)"
b=(${(M)a:#${~p}}) ;# tell zsh treat as a pattern for `$p`
print ${(qq)b}
;#⇒'fooa' 'foob'
Примечание: Это дает некоторые намеки на флаг расширения параметр b
для хранения шаблонов в переменные значения:
b
Цитата с обратной косой чертой только символы, которые подходят для соответствия шаблону. Это полезно, когда содержимое переменной должно быть проверено с использованием GLOB_SUBST
, включая переключатель ${~...}
.
Цитирование с использованием одного из флагов семейства q не подходит для этой цели, поскольку кавычки не удаляются из символов без шаблона на GLOB_SUBST
.Другими словами,
pattern=${(q)str}
[[ $str = ${~pattern} ]]
работает, если $str
является «a*b
», но не тогда, когда она «a b
», в то время как
pattern=${(b)str}
[[ $str = ${~pattern} ]]
всегда справедливо для любого возможного значения $str
.
- zshexpn(1): Expansion, Parameter Expansion, Parameter Expansion Flags
спасибо за этот большой ответ! –