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
}


