Bash: esegui command2 se command1 fallisce


43

Voglio fare qualcosa del genere:

if cmd1 && cmd2
echo success
else
echo epic fail
fi

Come dovrei farlo?


1
Ti manca la parola chiave "then" prima del comando "echo success".
Glenn Jackman,

10
Hmmm; il tuo pseudocodice sembra porre una domanda diversa da quella del tuo titolo .....
mattdm

Buona risorsa per alcune condizioni di uscita dello script di shell pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Risposte:


71

Questi dovrebbero fare quello che ti serve:

cmd1 && cmd2 && echo success || echo epic fail

o

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi

3
Funziona, ma sono confuso perché ||non guarda l'output del primo echocomando.
mlissner,

1
@mlissner, if if prevede di uscire dai codici, 0 se il comando è stato avviato e 1 se dove errori. Non leggere in uscita. Just try whoami && whoami && echo success || echo epic faile ora whoami && whoareyou && echo success || echo epic fail. Non riesco a capire cosa intendi con "non guarda all'output del primo comando echo"
m3nda,

@mlissner Penso di aver ricevuto la tua domanda, ma la risposta è che il comando echo non fallirà mai. Cioè, il suo ritorno sarà 0, vale a dire la verità. Quindi la condizione che conta davvero è solocmd1 && cmd2
Kazim Zaidi,

22

Petr Uzel è perfetto ma puoi anche giocare con $ $.

$? contiene il codice di uscita dall'ultimo comando eseguito e se lo usi puoi scrivere i tuoi script in modo abbastanza flessibile.

Questa domanda tocca un po 'questo argomento. Le migliori pratiche per usare $? a bash? .

cmd1 
if [ "$?" -eq "0" ]
then
  echo "ok"
else
  echo "Fail"
fi

Quindi puoi anche reagire a diversi codici di uscita e fare cose diverse, se lo desideri.


1
La mia azienda, PHP Experts, Inc. e io desideriamo ringraziarvi per essere parte integrante del nostro script CI interno. Grazie!
Theodore R. Smith

7

Lo pseudo-codice nella domanda non corrisponde al titolo della domanda.

Se qualcuno ha davvero bisogno di sapere come eseguire il comando 2 se il comando 1 fallisce, questa è una semplice spiegazione:

  • cmd1 || cmd2: Verrà eseguito cmd1e in caso di errore verrà eseguitocmd2
  • cmd1 && cmd2: Verrà eseguito cmd1e in caso di successo verrà eseguitocmd2
  • cmd1 ; cmd2: Questo verrà eseguito cmd1e quindi verrà eseguito cmd2, indipendentemente dall'errore o dal successo dell'esecuzione cmd1.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.