Bash [[ 패턴 일치가 작동하지 않습니다.

Bash [[ 패턴 일치가 작동하지 않습니다.

이것조건부 구성에 대한 Bash 참조 섹션설명하다:

When the ‘==’ and ‘!=’ operators are used, the string to the right of the 
operator is considered a pattern and matched according to the rules described 
below in Pattern Matching, as if the extglob shell option were enabled. ...
An additional binary operator, ‘=~’, is available, with the same precedence as 
‘==’ and ‘!=’. When it is used, the string to the right of the operator is 
considered an extended regular expression and matched accordingly (as in regex 
3)). 

하지만 나는 이것을 시도했습니다.

$ [[ -good == -* ]] ; echo $?
0
$ [[ -g == -* ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near `-*'
$ [[ -g == -? ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near `-?'

그런 다음 정규식 일치 연산자를 사용해 봅니다 =~.

$ [[ -good =~ -.* ]] ; echo $?
0
$ [[ -g =~ -.* ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near `-.*'
$ [[ -g =~ -.? ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near `-.?'

구문 오류가 발생하는 이유는 무엇입니까?

답변1

==글쎄요, 조심해야 합니다. 그렇지 않으면 왼쪽의 텍스트가 그런 내용이 =~아닙니다.!=Bash 조건식에서 인식되는 연산자.

귀하의 경우 bitset을 -g테스트하십시오 setgid. 이 컨텍스트에서 연산자로 인식되지 않는 항목을 제공하면 작동합니다.

$ [[ -i == -* ]] ; echo $?
0
$ [[ -i == -? ]] ; echo $?
0
$ [[ -i =~ -.* ]] ; echo $?
0
$ [[ -i =~ -.? ]] ; echo $?
0

문자열을 안정적으로 제공하는 한 가지 방법은 문자열을 인용하여 연산자로 인식하지 않고 문자열로만 인식하는 것입니다.

$ [[ "-good" == -* ]] ; echo $?
0
$ [[ "-g" == -* ]] ; echo $?
0
$ [[ "-g" == -? ]] ; echo $?
0
$ [[ "-good" =~ -.* ]] ; echo $?
0
$ [[ "-g" =~ -.* ]] ; echo $?
0
$ [[ "-g" =~ -.? ]] ; echo $?
0

하지만 인용하지 않도록 주의하세요.오른쪽연산자를 사용하면 패턴으로 인식되지 않습니다.

$ [[ "-good" == "-*" ]] ; echo $?
1
$ [[ "-g" == "-*" ]] ; echo $?
1
$ [[ "-g" == "-?" ]] ; echo $?
1
$ [[ "-good" =~ "-.*" ]] ; echo $?
1
$ [[ "-g" =~ "-.*" ]] ; echo $?
1
$ [[ "-g" =~ "-.?" ]] ; echo $?
1

답변2

문자열을 문자열로 평가하려면 따옴표 안에 문자열을 넣어야 합니다. 하이픈(-)이 포함된 문자열을 평가하려고 하면 셸은 이를 문자열이 아닌 테스트 옵션으로 처리합니다. 운송업체에 대한 자세한 내용은 여기를 참조하세요.여기

관련 정보