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]일치 5또는 6, 패턴 일치 허용 7.5또는 7.6. .게임 이후로모든 문자문자 그대로의 점과 일치하도록 백슬래시로 이스케이프 처리했습니다. 후행 공백은 일치하는 버전 문자열 뒤에 다른 문자가 오지 않도록 합니다.

답변2

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

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

아니면 우리는 제거우루크:

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

awkcatsum의 모든 작업은 여기에서 수행할 수 있습니다 [[...]].

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

관련 정보