Ich versuche, ein einfaches Bash-Skript zu erstellen, um zu überprüfen, ob die Website nicht verfügbar ist. Aus irgendeinem Grund funktioniert der Operator "und" nicht:
#!/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
Der Operator "-a" funktioniert auch nicht:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
Könnten Sie uns bitte auch mitteilen, wann Sie Folgendes verwenden sollten:
- einfache und doppelte eckige Klammern
- Klammern
?
bash
if-statement
HTF
quelle
quelle
-a
hat Duplizität. Bei Verwendung mit demtest
Befehl Bourne Shell Style , auch bekannt als[
, bedeutet diesand
. Bei Verwendung als bedingter Ausdruck wird geprüft, ob eine Datei vorhanden ist. Ja, es ist verwirrend, am besten vermieden.Antworten:
Was Sie haben, sollte funktionieren, es
${STATUS}
sei denn, es ist leer. Es wäre wahrscheinlich besser zu tun:if ! [ "${STATUS}" -eq 200 ] 2> /dev/null && [ "${STRING}" != "${VALUE}" ]; then
oder
if [ "${STATUS}" != 200 ] && [ "${STRING}" != "${VALUE}" ]; then
Es ist schwer zu sagen, da Sie uns nicht genau gezeigt haben, was mit Ihrem Skript falsch läuft.
Persönliche Meinung: niemals benutzen
[[
. Es unterdrückt wichtige Fehlermeldungen und ist nicht auf verschiedene Shells portierbar.quelle
STATUS
leer, wäre der Code von @HTF am fehlgeschlagen-ne: unary operator expected
. In Ihrem Fall wird es fehlschlageninteger expression expected
, nicht wahr?$STATUS
möglicherweise leere Problem und schlagen eine Lösung vor (unter Angabe). Ihre Lösung schlägt immer noch mit einem leeren fehlSTATUS
, das ist alles, was ich gemeint habe.${STATUS:-0"
. Wird bearbeitet.STATUS=; [ $STATUS -ne 13 ] 2>/dev/null && echo foo
Wird nicht ausgegebenfoo
, obwohl dies der Fall sein sollte (leer ist anders als 13). Was Sie zuerst vorgeschlagen haben,${STATUS:-0}
sieht viel besser aus.${STATUS:-0}
fehlSTATUS=foo
,! [ "$STATUS" -eq 200 ] 2> /dev/null && echo foo
funktioniert aber . IMO ist es jedoch besser zu vermeiden-eq
und zu verwenden!=
.Versuche dies:
if [ ${STATUS} -ne 100 -a "${STRING}" = "${VALUE}" ]
oder
if [ ${STATUS} -ne 100 ] && [ "${STRING}" = "${VALUE}" ]
quelle
Versuche dies:
if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then
quelle
Zitat:
Für eine ausführlichere Erklärung:
[
und]
sind keine Bash reservierten Wörter. Dasif
Schlüsselwort führt eine Bedingung ein, die von einem Job ausgewertet werden soll (die Bedingung ist wahr, wenn der Rückgabewert des Jobs ist0
oder anderweitig falsch).Für triviale Tests gibt es das
test
Programm (man test
).Wie manche Zeilen
if test -f filename; then foo bar; fi
usw. als störend empfinden, finden Sie auf den meisten Systemen ein Programm namens,[
das eigentlich nur ein Symlink zumtest
Programm ist. Wenntest
als aufgerufen wird[
, müssen Sie]
als letztes Positionsargument hinzufügen .So
if test -f filename
ist im Grunde das gleiche (in Bezug auf Prozesse erzeugt) wieif [ -f filename ]
. In beiden Fällen ist dietest
Programm gestartet und beide Prozesse sollten sich identisch verhalten.Hier ist Ihr Fehler:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
Wird zuif
+ einem Job analysiert , wobei der Job alles außer demif
selbst ist. Der Job ist nur ein einfacher Befehl (Bash spricht für etwas, das zu einem einzigen Prozess führt), was bedeutet, dass das erste Wort ([
) der Befehl und der Rest seine Positionsargumente ist. Nach dem ersten sind noch Argumente übrig]
.Auch nicht,
[[
ist in der Tat ein Bash-Schlüsselwort, aber in diesem Fall wird es nur als normales Befehlsargument analysiert, da es nicht am Anfang des Befehls steht.quelle