Я пытаюсь написать очень простой скрипт bash для запуска на сервере Linux. Я не уверен, почему это не работает.
Цель состоит в том, чтобы проверить, возвращает ли веб-сайт ответ 200 OK. Если да, то выход. Если это не так, запустите команду.
Сценарий:
#!/bin/bash
if HEAD https://google.com | grep '200\ OK' | wc -l; then
echo "Site is up";
else
sudo wo clean --all && sudo wo stack reload --all
fi
Проблема в том, что если сайт работает, он выдает ожидаемый результат. А именно...
1
Site is up
Но если сайт не работает (скажем, я заменяю https://google.com на https://766google.com, я получаю следующий вывод:
0
Site is up
Я пробовал множество вариантов, в том числе поместил команду HEAD ... в [ ].
Например, я пробовал это:
#!/bin/bash
if [ HEAD https://google.com | grep '200\ OK' | wc -l ]; then
echo "Site is up";
else
sudo wo clean --all && sudo wo stack reload --all
fi
Но затем, когда сайт не работает, он запускает нужную команду, но выдает ошибку ... Я получаю этот вывод:
./sitecheck.sh: line 3: [: missing `]'
wc: ]: No such file or directory
Cleaning NGINX FastCGI cache ...
[THE OUTPUT OF COMMAND IT RUNS WHEN SITE IS DOWN]
Кто-нибудь объясните, что не так с этим скриптом?
Спасибо.





Если вы хотите подсчитать количество строк вывода, вам нужно зафиксировать вывод конвейера с помощью $(...), а затем использовать ((...)) для арифметического сравнения. Один набор скобок — захват выходных данных; два набора - это арифметика.
if (($(HEAD https://google.com | grep '200 OK' | wc -l) > 0)); then
echo "Site is up";
else
sudo wo clean --all && sudo wo stack reload --all
fi
Более простой способ сделать это — использовать grep -q. Вместо вывода совпадений, требующих анализа вывода grep, grep -q напрямую возвращает код выхода успеха или ошибки, указывающий, найдено ли совпадение.
if HEAD https://google.com | grep -q '200 OK'; then
echo "Site is up";
else
sudo wo clean --all && sudo wo stack reload --all
fi
Чтобы просто создать сценарий для TRUE (вместо вывода «Сайт работает»), правильно ли я думаю, что могу просто использовать exit 1 в этой строке?
Ага. exit 1 если это ошибка. exit или exit 0, если это успех.
Я буквально понял это, пока вы, вероятно, печатали свой ответ. Что я просто выводил 0 или 1 как количество, а не как логическое значение (True/False). Отсюда проблема. Спасибо, что поделились правильным способом сделать это.