een “en” -exploitant voor een verklaring van “als” in BASH

Ik probeer een eenvoudig bash-script te maken om te controleren of de website down is en om een ​​of andere reden de “en” -exploitant werkt niet:

#!/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

de “-A-operator werkt ook niet:

if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]

Kunt u ook adviseren wanneer u wilt gebruiken:

  • enkele en dubbele vierkante haakjes
  • haakjes

?


Antwoord 1, Autoriteit 100%

Wat u moet doen, tenzij ${STATUS}leeg is. Het zou waarschijnlijk beter zijn om te doen:

if ! [ "${STATUS}" -eq 200 ] 2> /dev/null && [ "${STRING}" != "${VALUE}" ]; then

of

if [ "${STATUS}" != 200 ] && [ "${STRING}" != "${VALUE}" ]; then

Het is moeilijk te zeggen, omdat je ons niet precies hebt laten zien wat er mis gaat met je script.

Persoonlijke opinie: gebruik nooit [[. Het onderdrukt belangrijke foutmeldingen en is niet draagbaar voor verschillende schelpen.


Antwoord 2, Autoriteit 16%

Probeer dit:

if [ ${STATUS} -ne 100 -a "${STRING}" = "${VALUE}" ]

of

if [ ${STATUS} -ne 100 ] && [ "${STRING}" = "${VALUE}" ]

Antwoord 3, autoriteit 9%

Probeer dit:

if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then

Antwoord 4, autoriteit 4%

Citaat:

De operator “-a” werkt ook niet:

if [ $STATUS -ne 200 ] -a [[ “$STRING” != “$VALUE” ]]

Voor een uitgebreidere uitleg: [en ]zijn geen door Bash gereserveerde woorden. Het sleutelwoord ifintroduceert een voorwaarde die moet worden geëvalueerd door een baan (de voorwaarde is waar als de retourwaarde van de baan 0is of anders onwaar).

Voor triviale tests is er de testprogramma (man test).

Zoals sommigen vinden regels als if test -f filename; then foo bar; fi, etc. vervelend, op de meeste systemen vind je een programma genaamd [dat in feite slechts een symbolische link is naar het testprogramma. Wanneer testwordt aangeroepen als [, moet u ]toevoegen als laatste positionele argument.

Dus if test -f filenameis in principe hetzelfde (in termen van voortgebrachte processen) als if [ -f filename ]. In beide gevallen wordt het testprogramma gestart, en beide processen zouden zich identiek moeten gedragen.

Dit is je fout: if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]zal ontleden naar if+ een of andere taak, waarbij de taak alles is behalve de ifzelf. De taak is slechts een eenvoudig commando(Bash spreekt voor iets dat resulteert in een enkel proces), wat betekent dat het eerste woord ([) het commando is en de rest zijn positionele argumenten. Er zijn resterende argumenten na de eerste ].

Ook niet, [[is inderdaad een Bash-sleutelwoord, maar in dit geval wordt het alleen geparseerd als een normaal commando-argument, omdat het niet vooraan in het commando staat.

Other episodes