bash의 조건문에서 grep 사용


22

나는 여전히 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진술입니다. 내가 이해하는 것처럼 -qon grep명령은 if명령문에 대한 종료 코드를 제공합니다 . 그러나 나는 그것을 작동시키지 못하는 것 같습니다. 내가 어디 잘못 갔어?


if검사 를 제거 하고 항상 로그 파일에 에코 하면 스크립트가 작동합니까 ? dnssimple의 쇼는 $LOGIN전에 $TOKEN,하지만 당신은 그것을 놓치고있어. 어쩌면 그게 일이 실패했을까요?
Mikel

1
약간 수정했습니다. 변수를 DNSimple-Domain-Token필요로하지 않는를 사용하고 LOGIN있습니다.
CircularRecursion

내가 당신이라면, 인터넷 네트워크 인터페이스가 cron에서 5 분마다가 아닌 올라갈 때만 이것을 실행합니다. 또는 적어도 어딘가에 파일에 "$ IP"를 캐시 /var/tmp/icanhazip하고 마지막 실행 이후에 변경되지 않은 경우 exit 0다른 작업을 수행하기 전에 수행하십시오. IP 주소가 변경 될 때만 5 분마다 DDNS 항목을 업데이트 할 필요는 없습니다.
cas

좋은 생각-나는 그것을 추가하기 위해 노력할 것입니다.
CircularRecursion 8

답변:


28

거의 다 왔습니다. 느낌표를 생략하십시오.

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

결과:

MATCH

if조건은 종료 코드 0 (일치를 의미)로하면 그렙 수익을 실현된다. !느낌표이 무효화됩니다.


5

이미 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.