2017-10-20 51 views
0

Je veux être en mesure de regrouper les commandes ensemble de sorte que si l'un d'un groupe de commandes échoue, une autre est exécutée, à savoirComment regrouper les commandes pour les opérateurs de contrôle || et &&?

$ ping 1; echo 1 || echo 2 

retournera l'équivalent de

$ ping 1; echo 2 

avec le résultat

connect: Invalid argument 
2 

-à-dire les deux premières commandes ping 1 et echo 1 doivent être regroupées de telle sorte que si o aucun d'entre eux échoue, le troisième echo 2 sera exécuté.


choses que j'ai essayé,

  • $ (ping 1; echo 1) || echo 2
  • $ ((ping 1; echo 1)) || echo 2
  • $ [[ ping 1; echo 1)) || echo 2
  • $ { ping 1; echo 1; } || echo 2
  • $ eval "ping 1; echo 1" || echo 2
  • $ function try_ping { ping 1; echo 1; }; try_ping || echo 2

EDIT Je dois encore toutes les commandes dans ce premier groupe à courir, alors && ne fonctionnerait pas pour moi.

  1. Exécuter toutes les commandes du groupe 1
  2. Si l'une des commandes dans le groupe 1 FAIL (pas quitter l'état zéro)
  3. Lancez ensuite le deuxième groupe

Par exemple,

function my_ping { 
    local exit=0 
    command1 
    exit=$((exit + $?)) 
    command2 
    exit=$((exit + $?)) 
    if [[ "$exit" -ne "0" ]]; then 
     command3 
    fi 
} 
+0

Lorsque vous Wr ite 'ping 1', voulez-vous dire que seulement à titre d'exemple? "Argument invalide" provient de ping. – dbalakirev

+0

@dbalakirev Oui, c'est juste un exemple. – ning

Répondre

2
[email protected]:~$ ping 1 2>/dev/null && echo 1 || echo 2 
2 
[email protected]:~$ 

Vous pouvez utiliser & & pour les commandes traitées ensemble, si l'on échoue la chaîne est brisée. Ceci est votre exemple mais corrigé. Profitez-en.

P.S. J'ai redirigé le message d'erreur à null.

Mise à jour après votre modification

Ce script exécuté toutes les commandes du premier groupe et si la sortie de quelqu'un sans code de sortie 0 définir une variable en utilisant un si exécuter le deuxième groupe ou vous avertir que vous n'avez pas besoin de plus pour exécuter rien:

#!/bin/bash 

function check() { 
    $1 >/dev/null 2>&1 
    echo $? 
} 

command=("curl -sSL google.com" "echo 1" 'ping localhost -c 1' 'ls' 'false') 

for ((i=0;i<${#command[@]};i++)); do 
    echo "Command \"${command[$i]}\" returned value $(check "${command[$i]}")" 
    if (($(check "${command[$i]}") != 0)); then second=1; fi 
done 

if ((second == 1)); then 
    echo "I must run second group of commands because something have not worked!" 
    echo 2 
else 
    echo "All is gone without issues! Goodbye $USER!" 
    exit 0 
fi 

sortie

[email protected]:~/Scrivania$ bash ex 
Command "curl -sSL google.com" returned value 0 
Command "echo 1" returned value 0 
Command "ping localhost -c 1" returned value 0 
Command "ls" returned value 0 
Command "false" returned value 1 
I must run second group of commands because something have not worked! 
2 
[email protected]:~/Scrivania$ bash ex 
Command "curl -sSL google.com" returned value 0 
Command "echo 1" returned value 0 
Command "ping localhost -c 1" returned value 0 
Command "ls" returned value 0 
Command "true" returned value 0 # I have changed false to true in the command array 
All is gone without issues! Goodbye darby! 
[email protected]:~/Scrivania$ 
+1

J'ai besoin de la deuxième commande pour fonctionner, même si la première échoue. Désolé pour le phrasé ambigu, j'ai mis à jour pour clarifier ma réponse. – ning

+0

J'ai mis à jour mon code. J'espère que cela peut vous aider. ;) –

1

Que pensez-vous de cela?

OK=1 
ping 1 || OK=0 
echo 1 || OK=0 
[[ "$OK" == "0" ]] && echo 2 
0

Exemple:

ls && tree && echo success || echo epic fail 

Si les commandes ls ou tree échoueraient, 'échec épique' seront imprimés.

+0

J'ai besoin de la deuxième commande pour exécuter, même si le premier échoue. Désolé pour le phrasé ambigu, j'ai mis à jour pour clarifier ma réponse. – ning