2017-01-10 6 views
0

는 같은 있다고 가정합시다.

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

그런 다음 당신은 몇 가지 동적 인 방법으로 패턴을 구축 할 것으로 예상, 그래서 당신은 다른 변수에이 말 : 그래서

당신은

$ p="*(a|b)" 

그리고 당신이 기대 :

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

문서에 나와 있듯이 이전과 동일하게 작동하지만 그렇지 않습니다.

$ print ${(qq)b} 
'' 

왜 그렇습니까?

답변

0

zsh을 '은이 경우 (일반 문자열 텍스트) 문자 그대로의 값 : 우리는 $p 치료 zsh을 말할 수

a=('*(a|b)' fooa foob) 
p="*(a|b)" 
b=(${(M)a:#$p}) 
print ${(qq)b} 
;#⇒'*(a|b)' 

'$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 계열의 플래그 중 하나를 사용하는 인용 부호는에 의해 패턴이 아닌 문자에서 따옴표가 제거되지 않으므로이 용도로는 작동하지 않습니다.

pattern=${(b)str} 
    [[ $str = ${~pattern} ]] 

항상 $str의 가능한 값에 대한 사실 반면 즉, $str 경우

pattern=${(q)str} 
    [[ $str = ${~pattern} ]] 

작품은 'a*b'이지만 'a b'입니다하지 않을 경우.

-이 위대한 답변 zshexpn(1): Expansion, Parameter Expansion, Parameter Expansion Flags

+0

감사합니다! –