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
}