Остановка цикла во время выполнения Bash после успешного запроса на скручивание

case $message in
  (*[!' 
 ']*) : contains characters other space and newline
esac

Или:

case $message in
  (*[!"$(printf '\n ')"]*) : contains characters other space and newline
esac

Или используя стиль ksh93 -$'...'специальные кавычки (не вsh):

case $message in
  (*[!$' \n']*) : contains characters other space and newline
esac

Или вы можете использовать [:space:]класс символов POSIX, который соответствует любому пробелу, включая TAB, SPC, CR, NL...

case $message in
  (*[![:space:]]*) : contains non-whitespace characters
esac
0
09.04.2021, 20:28
2 ответа

Вы можете использовать код возврата из curl в операторе 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"
0
28.04.2021, 22:53

Принятый ответ на предложенную дублирующую цель показывает, как заставить 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может повторить попытку сам по себе, нет необходимости в цикле оболочки. Например, чтобы он повторил попытку десять раз и заснул на пять секунд перед повторной попыткой:

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
28.04.2021, 22:53

Теги

Похожие вопросы