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:
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.
Essaye ça:
if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then
Essaye ça:
if [ ${STATUS} -ne 100 -a "${STRING}" = "${VALUE}" ]
ou
if [ ${STATUS} -ne 100 ] && [ "${STRING}" = "${VALUE}" ]
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.