J'essaie de créer un simple script Bash pour vérifier si le site Web est en panne et pour une raison quelconque, l'opérateur "et" 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 indiquer quand utiliser:
- crochets simples et doubles
- parenthèse
?
-a
a la duplicité. Lorsqu'il est utilisé avec latest
commande de style Bourne shell , aka[
, cela signifieand
. Lorsqu'il est utilisé comme expression conditionnelle, il teste pour voir si un fichier existe. Oui, c'est déroutant, mieux vaut éviter.Réponses:
Ce que vous avez devrait fonctionner, sauf s'il
${STATUS}
est vide. Il vaudrait probablement mieux faire:ou
C'est difficile à dire, puisque vous ne nous avez pas montré exactement ce qui ne va pas avec votre script.
Opinion personnelle: ne jamais utiliser
[[
. Il supprime les messages d'erreur importants et n'est pas portable vers différents shells.la source
STATUS
est vide, le code de @HTF aurait échoué-ne: unary operator expected
. Dans votre cas, cela échouerainteger expression expected
, n'est-ce pas?$STATUS
pourrait être vide et suggérez une solution (en le citant). Votre solution échoue toujours avec un videSTATUS
, c'est tout ce que je voulais dire.${STATUS:-0"
. Éditera.STATUS=; [ $STATUS -ne 13 ] 2>/dev/null && echo foo
ne produit pas de sortiefoo
, même s'il le devrait (vide est différent de 13). Ce que vous avez suggéré en premier${STATUS:-0}
est bien meilleur.${STATUS:-0}
échouera siSTATUS=foo
, mais! [ "$STATUS" -eq 200 ] 2> /dev/null && echo foo
fonctionne. OMI, il vaut mieux éviter-eq
et utiliser!=
, cependant.Essaye ça:
la source
Essaye ça:
ou
la source
Citation:
Pour une explication plus élaborée:
[
et]
ne sont pas des mots réservés à Bash. Leif
mot clé introduit un conditionnel à évaluer par un travail (le conditionnel est vrai si la valeur de retour du travail est0
ou faux dans le cas contraire).Pour les tests triviaux, il y a le
test
programme (man test
).Comme certains trouvent des lignes comme
if test -f filename; then foo bar; fi
, etc. ennuyeuses, sur la plupart des systèmes, vous trouvez un programme appelé[
qui n'est en fait qu'un lien symbolique vers letest
programme. Quandtest
est appelé comme[
, vous devez ajouter]
comme dernier argument positionnel.Donc,
if test -f filename
c'est fondamentalement le même (en termes de processus engendrés) queif [ -f filename ]
. Dans les deux cas, letest
programme démarre et les deux processus doivent se comporter de la même manière.Voici votre erreur:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
analyseraif
+ un travail, le travail étant tout saufif
lui - même. Le travail n'est qu'une simple commande (Bash parle pour quelque chose qui aboutit à un seul processus), ce qui signifie que le premier mot ([
) est la commande et le reste ses arguments de position. Il reste des arguments après le premier]
.Ce n'est pas non plus
[[
un mot clé Bash, mais dans ce cas, il n'est analysé que comme un argument de commande normal, car il n'est pas au début de la commande.la source