Bash의 조건문에서 grep 사용

Bash의 조건문에서 grep 사용

저는 bash 스크립팅을 처음 접했고 기본이라고 생각되는 것을 시도해 보았습니다. Ubuntu 14.04를 실행하는 서버에서 업데이트된 DDNS를 실행하고 싶습니다.

dnsimple에서 일부 코드를 빌려서 지금까지 얻은 코드는 다음과 같습니다.

#!/bin/bash

LOGIN="email"
TOKEN="token"
DOMAIN_ID="domain"
RECORD_ID="record"
IP=`curl -s http://icanhazip.com/`

OUTPUT=`
curl -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -H "X-DNSimple-Domain-Token: $TOKEN" \
     -X "PUT" \
     -i "https://api.dnsimple.com/v1/domains/$DOMAIN_ID/records/$RECORD_ID" \
     -d "{\"record\":{\"content\":\"$IP\"}}"`

if ! echo "$OUTPUT" | grep -q "(Status:\s200)"; then

echo "match"

$(echo "$OUTPUT" | grep -oP '(?<="message":")(.[^"]*)' >> /home/ddns/ddns.log)
$(echo "$OUTPUT"| grep -P '(Status:\s[0-9]{3}\s)' >> /home/ddns/ddns.log)

fi

아이디어는 5분마다 실행되며 cronjob을 사용하여 작업한다는 것입니다. 그런 다음 컬의 출력을 확인하여 상태가 "200"인지 아니면 다른 것인지 확인하고 싶습니다. 다른 것이면 출력을 파일에 저장하고 싶습니다.

내가 일할 수 없는 것은 if진술이다. 내가 이해한 바에 따르면 명령을 -q실행하면 grep해당 명령문에 대한 종료 코드가 제공됩니다 if. 그러나 나는 그것을 작동시킬 수 없는 것 같습니다. 내가 어디서 잘못됐나요?

답변1

거의 다 왔습니다. 느낌표만 생략하세요.

OUTPUT='blah blah (Status: 200)'
if echo "$OUTPUT" | grep -q "(Status:\s200)"; then
    echo "MATCH"
fi

결과:

MATCH

ifgrep이 종료 코드 0(일치 항목을 나타냄)을 반환하면 조건이 충족된 것입니다. 느낌표는 !이를 무효화합니다.

답변2

이미 bash를 사용하고 있으므로 bash 안에 보관할 수 있습니다.

if [[ $OUTPUT =~ (Status:[[:space:]]200) ]]; then
  echo match
fi

샘플 실행:

OUTPUT='something bogus'
[[ $OUTPUT =~ (Status:[[:space:]]200) ]] && echo match


OUTPUT='something good (Status: 200)'
[[ $OUTPUT =~ (Status:[[:space:]]200) ]] && echo match
match

답변3

이것은대답은 아니다귀하의 질문에 대해서는 다른 스크립트 작성자의 조언이 있습니다.

  • 대신 백틱을 사용하세요 $(). 동시에 둘 다 사용하지 마세요.
  • 조건문 들여 if쓰기
  • 불필요한 용도 제거$()

일관성과 간단한 규칙은 장기적으로 스크립트를 디버깅하고 유지하는 데 도움이 됩니다.

#!/bin/bash

LOGIN="email"
TOKEN="token"
DOMAIN_ID="domain"
RECORD_ID="record"
IP=$(curl -s http://icanhazip.com/)

OUTPUT=$(
curl -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -H "X-DNSimple-Domain-Token: $TOKEN" \
    -X "PUT" \
    -i "https://api.dnsimple.com/v1/domains/$DOMAIN_ID/records/$RECORD_ID" \
    -d "{\"record\":{\"content\":\"$IP\"}}"
)

if ! echo "$OUTPUT" | grep -q "(Status:\s200)"; then
    echo "match"
    echo "$OUTPUT" | grep -oP '(?<="message":")(.[^"]*)' >> /home/ddns/ddns.log
    echo "$OUTPUT"| grep -P '(Status:\s[0-9]{3}\s)' >> /home/ddns/ddns.log
fi

관련 정보