Я пытаюсь создать простой скрипт Bash, чтобы проверить, не работает ли веб-сайт, и по какой-то причине оператор «и» не работает:
#!/usr/bin/env bash
WEBSITE=domain.com
SUBJECT="$WEBSITE DOWN!"
EMAILID="an@email.com"
STATUS=$(curl -sI $WEBSITE | awk '/HTTP\/1.1/ { print $2 }')
STRING=$(curl -s $WEBSITE | grep -o "string_to_search")
VALUE="string_to_search"
if [ $STATUS -ne 200 ] && [[ "$STRING" != "$VALUE" ]]; then
echo "Website: $WEBSITE is down, status code: '$STATUS' - $(date)" | mail -s "$SUBJECT" $EMAILID
fi
Оператор "-a" также не работает:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
Не могли бы вы также посоветовать, когда использовать:
- одинарные и двойные квадратные скобки
- круглая скобка
?
bash
if-statement
HTF
источник
источник
-a
имеет двуличность При использовании с командой стиля оболочки Bournetest
, иначе[
это означаетand
. При использовании в качестве условного выражения он проверяет, существует ли файл. Да, это сбивает с толку, лучше избегать.Ответы:
То, что у вас есть, должно работать, если
${STATUS}
не пусто. Вероятно, было бы лучше сделать:или
Трудно сказать, так как вы не показали нам точно, что не так с вашим сценарием.
Личное мнение: никогда не использовать
[[
. Он подавляет важные сообщения об ошибках и не переносится на разные оболочки.источник
STATUS
он пуст, код из @HTF не был бы включен-ne: unary operator expected
. В вашем случае это не удастсяinteger expression expected
, не так ли?$STATUS
может быть пустой, и предлагаете решение (цитируя ее). Ваше решение все еще терпит неудачу с пустымSTATUS
, это все, что я имел в виду.${STATUS:-0"
. Будет редактировать.STATUS=; [ $STATUS -ne 13 ] 2>/dev/null && echo foo
не выводитfoo
, даже если должен (пусто отличается от 13). То, что вы впервые предложили,${STATUS:-0}
выглядит гораздо лучше.${STATUS:-0}
не удастся, еслиSTATUS=foo
, но! [ "$STATUS" -eq 200 ] 2> /dev/null && echo foo
работает. ИМО, лучше избегать-eq
и использовать!=
, хотя.Попробуй это:
источник
Попробуй это:
или
источник
Quote:
Для более подробного объяснения:
[
а]
не Bash зарезервированные слова.if
Ключевым слово вводит условное быть оценены работами (условный верно , если возвращаемое значение РАБОЧЕГО МЕСТА является0
или ложным в противном случае).Для тривиальных тестов есть
test
программа (man test
).Так как некоторые находят такие строки, как
if test -f filename; then foo bar; fi
и т.д., раздражающими, в большинстве систем вы найдете программу с именем,[
которая на самом деле является только символической ссылкой наtest
программу. Когдаtest
вызывается как[
, вы должны добавить]
в качестве последнего позиционного аргумента.Так
if test -f filename
в основном то же самое (с точки зрения порожденных процессов) какif [ -f filename ]
. В обоих случаяхtest
программа будет запущена, и оба процесса должны вести себя одинаково.Вот ваша ошибка:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
проанализируюif
+ некоторую работу, работа - это все, кроме самойif
себя. Задание является простой командой (Bash говорит о чем-то, что приводит к одному процессу), что означает, что первое слово ([
) - это команда, а остальные - ее позиционные аргументы. Есть оставшиеся аргументы после первого]
.Также нет,
[[
это действительно ключевое слово Bash, но в этом случае оно анализируется только как обычный аргумент команды, потому что оно не находится в начале команды.источник