bash: if 표현식의 정규 표현식

bash: if 표현식의 정규 표현식

내 우분투 컴퓨터의 스크립트에서 다음과 같은 문자열을 선언합니다.

DEBUG_PACKAGE_LIST=$(apt-cache search dbg | awk '{ print $1 }' | grep -e "-dbg")

내 질문을 이해하도록 도와주세요여기의 출력은 다음과 같습니다

echo $DEBUG_PACKAGE_LIST >> debug

다음과 같은

if [[ ! $DEBUG_PACKAGE_LIST =~ "[^-a-z0-9]libmagick++5-dbg[a-z]*" ]]; then 
   echo "no contained"; 
fi

$DEBUG_PACKAGE_LISTecho는 "libmagick++5-dbgsym" 문자열이 포함되어 있어도 "포함하지 않음"을 나타냅니다 . 이유를 이해하도록 도와주실 수 있나요?

기본적으로 내 목표는 libmagick++5-dbg를 일치시키는 것이며 libmagick 앞에 공백 문자가 하나만 있을 수 있습니다.

답변1

버전 bash3.2 이상:

shopt -u compat31
[[ ! $DEBUG_PACKAGE_LIST =~ [^-[:alnum:]]'libmagick++5-dbg' ]];

bash3.1 에서 :

[[ ! $DEBUG_PACKAGE_LIST =~ '[^-[:alnum:]]libmagick\+\+5-dbg' ]];

(이것은 [a-z]*빈 문자열과도 일치하므로 중복되므로 항상 일치합니다.)

다음 두 가지 상황에 적용 가능합니다.

re='[^-[:alnum:]]libmagick\+\+5-dbg'
[[ ! $DEBUG_PACKAGE_LIST =~ $re ]]

답변2

정규식을 인용할 수 없습니다.이와 같은 표현식의 오른쪽에(사용하지 않는 한)배쉬 버전>= 3.0-알파 및 < 3.2-알파). 이렇게 하면 리터럴 문자열 간의 비교로 처리됩니다.

또한 Bash는 다음을 사용합니다.확장 정규식의 경우 특수 문자는 =~어디에 있습니까?+

답변3

정규식 대신 셸 패턴을 사용하여 이 작업을 수행할 수 있습니다. 문자열 앞에 공백을 추가하면 첫 번째 요소를 다른 요소와 다르게 처리할 필요가 없습니다.

if [[ " $DEBUG_PACKAGE_LIST" = *\ libmagick++5-dbg[a-z]* ]]; then 

(다음 필수 문자가 확실합니까 -dbg? 패키지 이름은 으로 끝납니다 -dbg.)

관련 정보