web-dev-qa-db-fra.com

Bash - un "et" opérateur pour "si" déclaration

J'essaie de créer un script bash simple pour vérifier si le site Web est en panne et pour une raison quelconque, l'opérateur "and" ne fonctionne pas:

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

L'opérateur "-a" ne fonctionne pas non plus:

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

Pourriez-vous également s'il vous plaît indiquer quand utiliser:

  • crochets simples et doubles
  • parenthèse
128
HTF

Ce que vous avez devrait fonctionner, à moins que ${STATUS} ne soit pas vide. Il serait probablement préférable de faire:

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

ou

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

C'est difficile à dire, car vous ne nous avez pas montré exactement ce qui ne va pas avec votre script.

Opinion personnelle: n'utilisez jamais [[. Ce n'est pas portable à différentes coquilles.

199
William Pursell

Essaye ça:

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

Essaye ça:

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

ou

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

Citation:

L'opérateur "-a" ne fonctionne pas non plus:

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

Pour une explication plus élaborée: [ et ] ne sont pas des mots réservés bash. Le mot clé if introduit une condition à évaluer par un travail (la condition est vraie si la valeur renvoyée par le travail est 0 ou false sinon).

Pour les tests triviaux, il existe le programme test (man test).

Comme certaines lignes comme if test -f filename; then foo bar; fi etc. sont gênantes, sur la plupart des systèmes, vous trouvez un programme appelé [ qui n'est en fait qu'un lien symbolique vers le programme test. Lorsque test est appelé comme [, vous devez ajouter ] comme dernier argument de position.

Donc, if test -f filename est fondamentalement identique (en termes de processus générés) à if [ -f filename ]. Dans les deux cas, le programme test sera lancé et les deux processus doivent se comporter de manière identique.

Voici votre erreur: if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]] analysera if + un travail, le travail étant tout sauf le if lui-même. Le travail est seulement un commande simple (bash parle de quelque chose qui aboutit à un processus unique), ce qui signifie que le premier mot ([) est la commande et le reste de ses arguments de position. Il reste des arguments après le premier ].

De plus, [[ est en effet un mot clé bash, mais dans ce cas, il est uniquement analysé comme un argument de commande normal, car il ne figure pas en tête de la commande.

11
Jo So