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