우리는 다음 변수를 설정합니다
status=ok
echo $status
ok
이제 정규식의 변수가 일치하는지 확인하고 싶습니다.
다음과 같이
[[ $status =~ [OK] ]] && echo "is the same"
[[ $status =~ OK ]] && echo "is the same"
[[ $status =~ "OK" ]] && echo "is the same"
그러나 위의 어느 것도 "동일하다"라고 인쇄되지 않습니다.
내 정규 표현식에 어떤 문제가 있나요?
답변1
[OK]
대괄호 안의 모든 문자와 일치하지만 대괄호는 대소 문자를 구분하지 않는다는 의미는 아닙니다.
다음을 수행할 수 있습니다.
[[ "$status" =~ ^[Oo][Kk]$ ]]
아니면 다음과 같이 할 수도 있습니다.
[[ "${status,,}" == ok ]]
인수 확산 연산자는 ,,
비교 목적으로 전체 변수를 소문자로 변환합니다.
답변2
[[ $status =~ OK ]]
(또는 [[ $status =~ "OK" ]]
) 일치하는 경우$status
포함하다 OK
, 다음과 [[ $status =~ [OK] ]]
일치하는 경우포함하다세트의 문자 OK
이므로 O
또는 K
.
^
정규 표현식의 경우 또는 $
다음을 사용해야 합니다 .닻주제 내에서 일치하는 대신 주제 전체를 일치시키려면 주제의 시작과 끝 부분에 각각 패턴을 사용하세요.
에서 대소문자를 구분하지 않는 일치를 수행하려면 bash
다음 nocasematch
옵션을 사용할 수 있습니다.
이는 [[ $var = pattern ]]
Korn 스타일이나 표준 case $var in (pattern)
과 일치하는 쉘 패턴과 [[ $var =~ regexp ]]
.
여기에서 다음을 수행할 수 있습니다.
shopt -s nocasematch
[[ $status = ok ]] && echo yes
[[ $status =~ ^ok$ ]] && echo yes
case $status in
(ok) echo yes
esac
nocasematch
(이를 유지하면 모든 패턴 일치 작업에 영향을 미치므로 나중에 설정을 해제하거나 이전 값으로 재설정 할 수 있습니다 ( typeset restore="$(shopt -p nocasematch)"
저장 및 eval "$restore"
복원 참조).
또는 다음을 사용할 수 있습니다.
[[ $status = [oO][kK] ]] && echo yes
[[ $status =~ ^[oO][kK]$ ]] && echo yes
case $status in
([oO][kK]) echo yes
esac
case $status in
(ok | OK | Ok | oK) echo yes
esac
기본 변형 은 case
표준 POSIX sh
구문입니다.
셸 에서 전역 옵션을 전역적으로 설정하는 대신(그리고 모든 패턴 일치 작업을 중단하는 대신) zsh
확장된 와일드카드 또는 PCRE 정규식 연산자를 사용하여 단일 패턴 또는 단일 패턴 기호의 일부에 대해 대소문자를 구분하지 않는 일치를 선택적으로 활성화할 수 있습니다nocasematch
예를 들어,
set -o extendedglob
[[ $status = (#i)ok ]]
또는:
zmodload zsh/pcre
[[ $status -pcre-match '^(?i)ok$' ]]
bash
또는 s 와 동등한 경우 à la csh 또는 다음을 ${var,,}
사용하십시오 .$var:l
${(L)var}
[ "$status:l" = ok ]
에서는 Bourne이 아닌 대부분의 쉘(적어도 csh, tcsh, rc, es, fish)과 같이 이전 명령의 종료 상태를 Bourne 스타일 별칭으로 유지하는 as라는 변수를 zsh
사용하지 않아야 합니다 .$status
$?
Korn 셸의 ksh93 변형( [[...]]
bash 및 zsh 모두에서 복사됨) 에서는 [[ $status = ~(i)ok ]]
.
답변3
다음과 같이 패턴 일치를 수행할 수 있습니다.
[[ $status == @(ok|OK|okay) ]] && echo "is the same"
또는 이전 게시물의 jesse_b의 아이디어와 유사하게 ^^
매개변수 확장 연산자는 비교 목적을 위해 전체 변수를 대문자로 변환합니다.
[[ "${status^^}" == OK ]] && echo "is the same"