zsh 조건식의 패턴 일치

zsh 조건식의 패턴 일치

zsh의 후크 기능에서 패턴 일치에 문제가 있습니다 precmd. 나는 다음을 가지고 있습니다 :

precmd(){
   local x='test'
   if [ $x = '*test*' ]; then
      echo 'hello'
   fi
}

hello를 인쇄하지 않습니다. 나는 이 코드를 잘 작동하는 일반 코드로 테스트했고 zsh test.zsh, 정규식을 사용하지 않고 시도했고 precmd잘 인쇄할 수 있는 항목도 얻었습니다. 이것이 예상대로 작동하지 않는 이유에 대한 단서가 있습니까?

$ zsh --version
zsh 4.3.11 RHEL 

답변1

[ $x = '*test*' ]확장으로 인해 생성된 문자열인 가 확장으로 인해 생성된 문자열인 와 같은지 여부 $x를 테스트 text합니다 .'*test*'*text*

변수의 값이 x일치 하는지 테스트하려면무늬 *test*=, or ==연산자를 사용해야 합니다.zsh 조건식, 안에 쓰여진이중 괄호 [[ … ]]. 또한 패턴의 특수 문자는 인용되지 않아야 합니다. 그렇지 않으면 특수 문자는 그 자체를 의미합니다. 따라서:

if [[ $x == *test* ]]; then …

조건식의 구문은 단일 괄호 안에 사용할 수 있는 표현식의 구문과 유사 [ … ]하지만 동일하지는 않습니다. [일반 명령처럼 구문 분석됩니다. 실제로 이는 다음과 동일한 한 문자 이름을 가진 내장 명령입니다.test내장단, [끝에 추가 인수가 필요합니다 ]. [[ … ]]내부에 쉘 특수 문자를 포함할 수 있는 고유한 문법 구조입니다. 일치하는 파일 이름 목록(globbing)으로 [ $x = *test* ]확장되고 내장 기능은 그 결과를 구문 분석하게 됩니다. globbing을 호출하지 않는 조건식 구문 분석의 일부로 구문 분석합니다 .*test*test[[ $x = *test* ]]*test*

답변2

*test*유효한 정규식 패턴이 아닙니다. 는 *반복 연산자이며 반복할 내용이 필요합니다. .*test.*기본적으로 고정되어 있지 않기 때문에 정규식에서는 필요하지 않지만 원할 가능성이 높습니다 . 그냥 찾아보시면 될 것 같아요test

그러나 정규식 패턴을 연산자와 일치시킬 수는 =없으므로 =~.

precmd () {
   local x=test
   if [[ $x =~ test ]]; then
      echo 'hello'
   fi
}

관련 정보