risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come verificare lo stato di uscita usando un'istruzione if usando Bash

Mi chiedevo quale sarebbe il modo migliore per verificare lo stato di uscita in un'istruzione if per poter echeggiare un output specifico.

Sto pensando di essere

if [ $? -eq 1 ]
then
   echo "blah blah blah"
fi

Il problema che sto riscontrando è che l'istruzione exit è prima dell'istruzione if semplicemente perché deve avere quel codice di uscita. Inoltre, so che sto facendo qualcosa di sbagliato dal momento che l'uscita ovviamente uscire dal programma.

165
deadcell4

Ogni comando eseguito ha uno stato di uscita.

Questo controllo sta guardando lo stato di uscita del comando che è terminato più di recente prima che quella linea venga eseguita.

Se vuoi il tuo script per uscire quando quel test restituisce true (il precedente comando fallito) allora metti exit 1 (o qualsiasi altra cosa) all'interno di quel blocco if dopo il echo.

Detto questo, se si sta eseguendo il comando e si desidera testarne l'output usando il seguente è spesso più diretto.

if some_command; then
    echo command returned true
else
    echo command returned some error
fi

O per girarlo, usa ! per la negazione

if ! some_command; then
    echo command returned some error
else
    echo command returned true
fi

Nota che nessuna delle due preoccupazioni è il codice di errore. Se sai che ti interessa solo un codice di errore specifico, allora devi controllare $? manualmente.

173
Etan Reisner

Nota che i codici di uscita! = 0 sono usati per segnalare un errore. Quindi, è meglio fare:

retVal=$?
if [ $retVal -ne 0 ]; then
    echo "Error"
fi
exit $retVal

invece di

# will fail for error codes > 1
retVal=$?
if [ $retVal -eq 1 ]; then
    echo "Error"
fi
exit $retVal
123
Oo.oO

$? è un parametro come un altro. È possibile salvare il suo valore da utilizzare prima di chiamare exit.

exit_status=$?
if [ $exit_status -eq 1 ]; then
    echo "blah blah blah"
fi
exit $exit_status
32
chepner

Alternativa alla dichiarazione if esplicita

Minimamente:

test $? -ne 0 || echo "something bad happened"

Completare:

EXITCODE=$?
test $EXITCODE -ne 0 && echo "something good happened" || echo "something bad happened"; 
exit $EXITCODE
1
Catskul