Я шукаю просту перевірку оболонки (+ curl), яка оцінила б як істинне чи хибне, якщо URL-адреса існує (повертає 200) чи ні.
Відповіді:
Використання --failзробить статус виходу ненульовим при невдалому запиті. Використання --headдозволить уникнути завантаження вмісту файлу, оскільки він нам не потрібен для цієї перевірки. Використання --silentдозволить уникнути випуску стану або помилок самою перевіркою.
if curl --output /dev/null --silent --head --fail "$url"; then
echo "URL exists: $url"
else
echo "URL does not exist: $url"
fi
Якщо ваш сервер відхиляє запити HEAD, альтернативою є запит лише на перший байт файлу:
if curl --output /dev/null --silent --fail -r 0-0 "$url"; then
-r 0-0запиту лише першого байта файлу. Я відповідно змінив відповідь.
return 0і return 1для truthiness і falsiness, а не використовувати стандартний висновок для повернення trueі falseяк рядки. Таким чином, хтось може запустити:, if existURL "$url"без зайвих (неефективних) накладних витрат на спроби захопити його stdout і інтерпретувати те саме.
Я вважаю, що wget є кращим інструментом для цього, ніж CURL; є менше варіантів, які слід запам’ятати, і ви насправді можете перевірити на істинність значення в bash, щоб побачити, чи вдалося це за замовчуванням.
if wget --spider http://google.com 2>/dev/null; then
echo "File exists"
else
echo "File does not exist"
fi
В --spiderопції робить Wget просто перевірити на файл , а не завантажуючи його, і 2> /dev/nullзамовчування Wget'S STDERR вихід.
--failцього можна зробити те ж саме з завиванням.
wget google.com/asdfі curl google.com/asdf. curlповертає EXIT_SUCCESS за замовчуванням при виникненні помилки 404, тоді як wgetповертає EXIT_FAILURE.
--spiderаргумент: він wgetповертається після перевірки існування файлу, а не завантаження.
-o /dev/nullдля придушення друку заголовка на stdout