저는 현재 bash 스크립트 작성 방법을 배우고 있습니다. 내 컬 요청이 200 응답 코드를 받으면 while 루프를 어떻게 중지합니까?
aws --endpoint-url http://s3.sample.com/ s3 cp hello.php s3://bucket/
while [ true ]
do
curl http://sample.com/hello.php &> /dev/null
done
답변1
수락된 답변제안된 중복 대상curl
서버 오류가 발생하면 실패하고 22
종료 상태를 반환하는 방법을 보여줍니다 . 이를 바탕으로 다음과 같이 작성할 수 있습니다.
until curl -s -f -o /dev/null "http://example.com/foo.html"
do
sleep 5
done
" curl
요청한 전송이 성공적으로 완료될 때까지 5초 동안 기다린 후 다시 시도하십시오." 라는 메시지가 나타납니다. 응답 내용에 관심이 없다고 가정하면 오류 발생 시 서버가 -f
실패하여 메시지와 진행률 표시기가 인쇄되지 않도록 합니다 .curl
-s
-o /dev/null
그러나 curl
자체적으로 재시도하는 기능에는 셸 루프가 필요하지 않습니다. 예를 들어, 10번 재시도하고 재시도하기 전에 5초 동안 휴면 상태로 만들려면 다음을 수행하세요.
curl --retry 10 --retry-delay 5 -s -o /dev/null "http://example.com/foo.html"
또는 일시적이지 않은 HTTP 오류(예: 404)에도 재시도하려는 경우:
curl --retry 10 -f --retry-all-errors --retry-delay 5 \
-s -o /dev/null "http://example.com/foo.html"
curl
대신 응답에 특정 HTTP 상태가 표시될 때까지 실행하려는 경우 :
until [ \
"$(curl -s -w '%{http_code}' -o /dev/null "http://example.com/foo.html")" \
-eq 200 ]
do
sleep 5
done
-w
전송이 완료된 후 curl
형식 문자열(여기)에 지정된 정보가 표시됨을 나타냅니다.%{http_code}
답변2
if 문에서 컬의 반환 코드를 사용하여 exit
루프를 실행할 수 있습니다.
while [ true ]
do
curl http://sample.com/hello.php &> /dev/null
if [[ "$?" -eq 0 ]]; then
exit 0
fi
done
어떤 이유로 루프 이후에 스크립트를 계속 실행하려면 를 사용할 수 break
있습니다 exit
.
while [ true ]
do
curl http://sample.com/hello.php &> /dev/null
if [[ "$?" -eq 0 ]]; then
break
fi
done
echo "I made it out of the loop"