Come controllare se un comando è riuscito?

C'è un modo per controllare se c'è un errore nell'esecuzione di un comando?

Esempio :

test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1

function valid () {
  if $test -eq 1; then
    echo "OK"
    else echo "ERROR" 
  fi
}

Ho già provato a farlo ma sembra che non funzioni. Non so come farlo.

Soluzione

Il valore di ritorno è memorizzato in $?. 0 indica il successo, altri indicano l'errore.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

Come qualsiasi altro valore testuale, puoi memorizzarlo in una variabile per un confronto futuro:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

Per i possibili operatori di confronto, vedi man test.

Commentari (9)

Se hai solo bisogno di sapere se il comando è riuscito o fallito, non preoccuparti di testare $?, prova direttamente il comando. Per esempio:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

E assegnare l'output a una variabile non cambia il valore di ritorno (beh, a meno che non si comporti diversamente quando stdout non è un terminale, ovviamente).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals spiega if in modo più dettagliato.

Commentari (2)

$? dovrebbe contenere lo stato di uscita del comando precedente, che dovrebbe essere zero per nessun errore.

Quindi, qualcosa come;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

per la maggior parte dei casi, è più facile usare il costrutto && per concatenare comandi che devono dipendere l'uno dall'altro. Quindi cd /nonexistant && echo success! non sarebbe non echo success perché il comando si interrompe prima di &&. Il corollario di questo è ||, dove cd /nonexistant || echo fail sarebbe echo fail perché cd è fallito. (questo diventa utile se usate qualcosa come ||exit, che terminerà lo script se il comando precedente è fallito).

Commentari (2)