bash 코드에서 정규식을 사용하는 경우

bash 코드에서 정규식을 사용하는 경우

나는 bash다음을 수행했습니다. 이 표현식은 Redhat 버전이 7.5인지 7.6인지 if평가합니다 .true

if [[ ` cat /etc/redhat-release  | awk '{print $7}' ` == "7.5" ]] || [[ ` cat /etc/redhat-release  | awk '{print $7}' ` == "7.6" ]]
then
.
.
.

정규식을 사용하여 좀 더 우아한 방식으로 처리할 수 있나요?

내용은 다음과 같습니다 /etc/redhat-release.

cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)

답변1

릴리스 문자열을 직접 확인하는 것이 훨씬 간단합니다.

if grep -q 'release 7\.[56] ' /etc/redhat-release
then ...

명령 은 grep정규식과 일치합니다. 원자 는 또는 와 [56]일치 하므로 패턴이 또는 와 일치할 수 있습니다 . 경기 이후567.57.6.모든 문자문자 그대로의 점과 일치하도록 백슬래시를 사용하여 이스케이프 처리했습니다. 후행 공백은 일치하는 버전 문자열 뒤에 다른 문자가 없음을 보장합니다.

답변2

bash의 내장 문자열 일치 기능을 사용하면 이를 수행할 수 있습니다 . 이는 정규 표현식이 아닌 glob(와일드카드) 패턴을 사용한다는 점에 유의하세요.

if [[ $(cat /etc/redhat-release  | awk '{print $7}') == 7.[56] ]]

아니면, 우리는UUoC:

if [[ $(awk '{print $7}' /etc/redhat-release) == 7.[56] ]]

또는...

if [[ $(cat /etc/redhat-release) == *" release 7."[56]" "* ]]

아니면 (@kojiro 덕분에)...

if [[ $(< /etc/redhat-release) == *" release 7."[56]" "* ]]

(전체 줄과 일치하도록 하려면 시작과 끝 부분에 와일드카드가 필요합니다. 숫자 뒤의 인용된 공백은 실수로 "7.50"과 일치하지 않도록 하기 위한 것입니다.)

또는 정말로 정규식을 사용하고 싶다면 =~RE 구문을 사용하고 전환하세요.

if [[ $(< /etc/redhat-release) =~ " release 7."[56]" " ]]

(따옴표 안의 부분은 문자 그대로 일치하므로 .이스케이프하거나 대괄호로 묶을 필요가 없습니다(호환성을 활성화하지 않는 한 bash31). 그리고 RE 일치는 기본적으로 고정되지 않으므로 필요하지 않습니다. 지난번처럼 끝 부분에 아무 것도 없습니다.)

답변3

awkcat및 여기에서 모든 작업을 수행할 수 있습니다 [[...]].

if
  </etc/redhat-release awk -v ret=1 '
    $7 ~ /^7\.[56]$/ {ret=0}
    END {exit(ret)}'
then
  ...

또는 sh간단한 와일드카드 패턴 일치를 사용하는 표준 구문을 사용합니다.

case $(cat /etc/redhat-release) in
  (*'release 7.'[56]' '*) ...;;
  (*) ...;;
esac

답변4

Bash는 를 사용하여 한 줄의 필드 7을 꺼낼 수 read있으며 이러한 "/etc/*-release" 유형 파일은 어쨌든 한 줄인 경향이 있습니다. 고려하다

read _ _ _ _ _ _ ver _ < /etc/redhat-release
if [[ $ver = 7.[56] ]]; then
    # match
fi

관련 정보