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내장그러나 마지막에는 내부적으로 쉘 특수 문자를 포함할 수 있는 고유한 구문 구조인 [추가 매개변수가 필요합니다 ]. 일치하는 파일 이름(와일드카드) 목록으로 확장되고 내장 함수는 결국 결과를 구문 분석합니다. 조건식 구문 분석의 일부로 구문 분석되며 와일드카드는 호출되지 않습니다.[[ … ]][ $x = *test* ]*test*test[[ $x = *test* ]]*test*

답변2

*test*유효한 정규식 패턴이 아닙니다. 이것은 *반복 연산자이며 무언가를 반복해야 합니다. .*test.*이는 기본적으로 고정되어 있지 않기 때문에 정규식에는 필요하지 않지만 원하는 것일 가능성이 높습니다 . 검색하시면 됩니다test

그러나 정규식 패턴을 연산자와 =일치시킬 수는 없습니다 =~.

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

관련 정보