내 우분투 컴퓨터의 스크립트에서 다음과 같은 문자열을 선언합니다.
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_LIST
echo는 "libmagick++5-dbgsym" 문자열이 포함되어 있어도 "포함하지 않음"을 나타냅니다 . 이유를 이해하도록 도와주실 수 있나요?
기본적으로 내 목표는 libmagick++5-dbg를 일치시키는 것이며 libmagick 앞에 공백 문자가 하나만 있을 수 있습니다.
답변1
버전 bash
3.2 이상:
shopt -u compat31
[[ ! $DEBUG_PACKAGE_LIST =~ [^-[:alnum:]]'libmagick++5-dbg' ]];
bash
3.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
.)