bash if / else 문에서 파일 grep 비교를 어떻게 사용합니까?


138

서버가 나타나면 파일을 확인하여 서버 구성 방법을 확인해야합니다.

/etc/aws/hosts.conf 파일에서 다음 문자열을 검색하려고합니다.

MYSQL_ROLE=master

그런 다음 해당 문자열이 존재하는지 테스트하고 if / else 문을 사용하여 문자열 존재 여부에 따라 두 옵션 중 하나를 실행합니다.

if 문의 BASH 구문은 무엇입니까?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi

답변:


205

에서 grep --help뿐만 아니라 참조 남자 GREP를 :

행을 선택한 경우 종료 상태는 0이고 그렇지 않은 경우 1입니다. 오류가 발생하고 -q가 제공되지 않은 경우 종료 상태는 2입니다.

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi

^MYSQL_ROLE=master$주석에서 해당 문자열, "마스터"로 시작하는 이름 등 을 피하기 위해 보다 구체적인 정규식을 사용할 수 있습니다 .

이는 if 가 명령을 가져 와서 실행 하기 때문에 작동 하며, 명령의 리턴 값을 사용하여 진행 방법을 결정하는데, 0은 true를 의미하고 0이 아닌 의미는 셸에서 다른 리턴 코드를 해석하는 방법과 동일합니다. 그리고 C와 같은 언어의 반대


> 0을 의미하고 0이 아닌 의미를 거짓으로-쉘에서 다른 리턴 코드를 해석하는 방법과 동일하지만 C와 같은 언어의 반대와 같은 이유는 무엇입니까?
kchoi

일반적으로 0은 "오류 없음"으로 해석되고 다른 것은 "일부 오류"를 의미합니다. 그렇다면 명령이 성공적으로 완료되었는지 알고 싶다고 가정합니다.
timelmer


23

대한, 그주의 PIPE모든 명령 또는 다음 명령의 순서 인 :

if PIPE ; then
  # do one thing if PIPE returned with zero status ($?=0)
else 
  # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error
fi 

기록을 [ expr ]위해 쉘 내장 속기입니다 test expr.

grep일치하는 경우 상태 0으로 돌아가고 일치하지 않는 경우 0이 아닌 상태로 반환 되므로 다음을 사용할 수 있습니다.

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 

-l적어도 하나의 일치 항목이있는 파일 만 사용 하므로 grep입력 파일을 구문 분석 할 필요없이 하나의 일치 항목을 찾 자마자 반환됩니다.

일부 플랫폼에 [ expr ]내장 명령이 아니라 실제 실행 /bin/[(그의 마지막 인수가 될 것입니다 ]) 이유입니다 [ expr ]대괄호 주위에 공백을 포함해야하며,이 다음에해야하는 이유 명령 목록 구분 중 하나 ( ;, &&, ||, |, &, 개행)


4
-l중복 grep됩니다. 다음과 일치하는 항목을 찾으면 즉시 반환됩니다.-q
Reinstate Monica Please

3

bash를 사용하십시오.

while read -r line
do
  case "$line" in
    *MYSQL_ROLE=master*)
       echo "do your stuff";;
    *) echo "doesn't exist";;      
  esac
done <"/etc/aws/hosts.conf"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.