web-dev-qa-db-fra.com

Négocier si condition dans le script bash

Je suis nouveau sur bash et je suis coincé pour essayer d’annuler la commande suivante:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Sorry you are Offline"
        exit 1

Ceci si la condition redevient vraie si je suis connecté à Internet. Je veux que ça se passe dans l'autre sens, mais mettre ! ne semble pas fonctionner n'importe où.

130
Don Drenai

Tu peux choisir:

if [[ $? -ne 0 ]]; then       # -ne: not equal

if ! [[ $? -eq 0 ]]; then     # -eq: equal

if [[ ! $? -eq 0 ]]; then

! inverse le retour de l'expression suivante, respectivement.

173
Cyrus

Mieux

if ! wget -q --spider --tries=10 --timeout=20 google.com
then
  echo 'Sorry you are Offline'
  exit 1
fi
72
Steven Penny

Si vous vous sentez paresseux, voici une méthode succincte de gestion des conditions utilisant || (ou) et && (et) après l'opération:

wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }
8
Cole Tierney

Puisque vous comparez des nombres, vous pouvez utiliser un expression arithmétique , ce qui simplifie le traitement des paramètres et la comparaison:

wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
    echo "Sorry you are Offline"
    exit 1
fi

Remarquez qu'au lieu de -ne, vous pouvez simplement utiliser !=. Dans un contexte arithmétique, nous n’avons même pas besoin de préfixer $ aux paramètres, c.-à-d.,

var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"

fonctionne parfaitement bien. Cela ne s'applique toutefois pas au paramètre spécial $?.

De plus, étant donné que (( ... )) évalue les valeurs non nulles comme vraies, c’est-à-dire qu’il a un état de retour égal à 0 pour les valeurs non nulles et un état de retour égal à 1, sinon, nous pourrions raccourcir à

if (( $? )); then

mais cela pourrait semer la confusion chez plus de personnes que ne le valent les touches enregistrées.

La construction (( ... )) est disponible dans Bash, mais n'est pas requise par spécification POSIX Shell (mentionnée cependant comme une extension possible).

Ceci dit, il vaut mieux éviter $? à mon avis, comme dans réponse de Cole et réponse de Steven .

4
Benjamin W.

Vous pouvez utiliser une comparaison inégale -ne au lieu de -eq:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi
4
davidhigh