Próbuję utworzyć prosty skrypt Bash, aby sprawdzić, czy witryna nie działa iz jakiegoś powodu operator „and” nie działa:
#!/usr/bin/env bash
WEBSITE=domain.com
SUBJECT="$WEBSITE DOWN!"
EMAILID="[email protected]"
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
Operator „-a” również nie działa:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
Czy mógłbyś również doradzić, kiedy użyć:
- pojedyncze i podwójne nawiasy kwadratowe
- nawias
?
bash
if-statement
HTF
źródło
źródło
-a
ma dwulicowość. W połączeniu ztest
poleceniem stylu powłoki Bourne'a[
, oznacza toand
. Gdy jest używane jako wyrażenie warunkowe , sprawdza, czy plik istnieje. Tak, jest to mylące, najlepiej tego unikać.Odpowiedzi:
To, co masz, powinno działać, chyba że
${STATUS}
jest puste. Prawdopodobnie lepiej byłoby zrobić:lub
Trudno powiedzieć, ponieważ nie pokazałeś nam dokładnie, co jest nie tak z twoim skryptem.
Osobista opinia: nigdy nie używaj
[[
. Pomija ważne komunikaty o błędach i nie można go przenosić do różnych powłok.źródło
STATUS
jest pusty, kod z @HTF nie powiódłby się-ne: unary operator expected
. W twoim przypadku to się nie udainteger expression expected
, prawda?$STATUS
może być pusty i sugerujesz rozwiązanie (cytując). Twoje rozwiązanie nadal zawodzi z pustymSTATUS
, to wszystko, co miałem na myśli.${STATUS:-0"
. Będzie edytować.STATUS=; [ $STATUS -ne 13 ] 2>/dev/null && echo foo
nie wyprowadzafoo
, mimo że powinien (pusty różni się od 13). To, co zasugerowałeś jako pierwszy,${STATUS:-0}
wygląda o wiele lepiej.${STATUS:-0}
nie powiedzie się, jeśliSTATUS=foo
, ale! [ "$STATUS" -eq 200 ] 2> /dev/null && echo foo
działa. IMO, lepiej jednak unikać-eq
i używać!=
.Spróbuj tego:
źródło
Spróbuj tego:
lub
źródło
Zacytować:
Aby uzyskać bardziej szczegółowe wyjaśnienie:
[
i]
nie są to zastrzeżone słowa Bash. Słowoif
kluczowe wprowadza warunek, który ma być oceniany przez zadanie (warunek jest prawdziwy, jeśli wartość zwracana przez zadanie wynosi0
lub fałsz w innym przypadku).W przypadku trywialnych testów istnieje
test
program (man test
).Ponieważ niektórzy uważają, że takie linie
if test -f filename; then foo bar; fi
itp. Są irytujące, w większości systemów można znaleźć wywoływany program,[
który w rzeczywistości jest tylko dowiązaniem symbolicznym dotest
programu. Gdytest
jest wywoływana jako[
, musisz dodać]
jako ostatni argument pozycyjny.Więc
if test -f filename
jest w zasadzie to samo (pod względem powstających procesów) jakif [ -f filename ]
. W obu przypadkachtest
program zostanie uruchomiony i oba procesy powinny zachowywać się identycznie.Oto twój błąd:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
przeanalizujeif
+ do jakiejś pracy, przy czym praca będzie wszystkim opróczif
siebie. Zadanie jest tylko prostym poleceniem (Bash mówi o czymś, co powoduje pojedynczy proces), co oznacza, że pierwsze słowo ([
) to polecenie, a reszta to argumenty pozycyjne. Po pierwszym są pozostałe argumenty]
.Również nie,
[[
jest rzeczywiście słowem kluczowym Bash, ale w tym przypadku jest przetwarzane tylko jako zwykły argument polecenia, ponieważ nie znajduje się na początku polecenia.źródło