IF 문에서 Linux Bash OR 연산자가 예상대로 작동하지 않습니다.

IF 문에서 Linux Bash OR 연산자가 예상대로 작동하지 않습니다.

서로 다른 명명 규칙을 가진 2개의 호스트가 있다고 가정해 보겠습니다.

ab_01그리고ab_cd

나는 그들의 명명 규칙이 특정 표준을 충족하는지 확인하고 싶습니다.

그래서 테스트하기 위해 간단한 스크립트를 작성했습니다.

wolf@linux:~$ host='ab_01'

wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] ]]; then echo True; else echo False; fi
False

wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[0-9][0-9] ]]; then echo True; else echo False; fi
True

효과가있다!

다음 단계는 이 두 정규식을 셸의 OR 연산자와 결합하는 것입니다.||

if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
then
    echo True
else
    echo False
fi

테스트해보자

wolf@linux:~$ echo $host
ab_01
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
> then
>     echo True
> else
>     echo False
> fi
True
wolf@linux:~$

그것은 ab_01및 에서 작동합니다 ab_cd.

그러나 호스트 이름에 더 많은 문자를 추가하면 False여야 하는데 여전히 True가 표시됩니다.

다음을 사용하여 host='ab_0123'테스트 해 보겠습니다.host='ab_cdef'

wolf@linux:~$ host='ab_0123'
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
> then
>     echo True
> else
>     echo False
> fi
True
wolf@linux:~$ 

또 다른 테스트에서는 False 대신 True가 표시됩니다.

wolf@linux:~$ host='ab_cdef'
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
> then
>     echo True
> else
>     echo False
> fi
True
wolf@linux:~$ 

이 코드에 어떤 문제가 있으며 어떻게 해결하나요?

답변1

패턴 일치와 달리 정규식 일치는 문자열의 시작/끝에 고정되지 않습니다.어딘가에문자열이면 충분합니다. ("일치"라기보다는 "검색"에 더 가깝고 일부 Python 함수 이름이 차이를 만든다고 생각합니다 ab_cdef. ab_cd)

^및 다음을 사용하여 패턴을 명시적으로 고정해야 합니다 $.

$ if [[ foobar =~ o ]]; then echo yes; else echo no; fi
yes
$ if [[ foobar =~ ^o$ ]]; then echo yes; else echo no; fi
no

||정규식에 대체 항목을 넣을 수도 있습니다 .

re='^[a-z][a-z]_([0-9][0-9]|[a-z][a-z])$'
if [[ $host =~ $re ]]; then ...

(또는 더 편안한 정규 표현식이 허용됩니다 ab_a0: ^[a-z][a-z]_[0-9a-z][0-9a-z]$.)

관련 정보