2017-01-10 12 views
0

Предположим, у вас есть что-то вроде:Почему это расширение внутри шаблона расширения не работает?

$ a=(fooa foob foox)          

Тогда вы можете сделать:

$ b=(${(M)a:#*(a|b)}) 

Для выбора элементов а элементы, соответствующие шаблону.

Так у вас есть:

$ print ${(qq)b} 
'fooa' 'foob' 

Тогда вы ожидаете, чтобы построить модель в какой-то динамично, так что вы имеете в другой переменной, скажем:

$ p="*(a|b)" 

И вы ожидаете это:

$ b=(${(M)a:#$p})  

Будет работать так же, как и раньше, как указано в документации, но это не так:

$ print ${(qq)b} 
'' 

Почему?

ответ

0

Поскольку ЗШ пытается выбрать «значение 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

+0

спасибо за этот большой ответ! –

 Смежные вопросы

  • Нет связанных вопросов^_^