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 if
introduceert een voorwaarde die moet worden geëvalueerd door een baan (de voorwaarde is waar als de retourwaarde van de baan 0
is of anders onwaar).
Voor triviale tests is er de test
programma (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 test
programma. Wanneer test
wordt aangeroepen als [
, moet u ]
toevoegen als laatste positionele argument.
Dus if test -f filename
is in principe hetzelfde (in termen van voortgebrachte processen) als if [ -f filename ]
. In beide gevallen wordt het test
programma 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 if
zelf. 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.