Hvordan sjekke om en kommando lyktes?

Finnes det noen måte å sjekke om det er en feil i utførelsen av en kommando?

Eksempel:

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
}

Jeg har allerede prøvd å gjøre det, men det ser ut til at det ikke fungerer. Jeg vet ikke hvordan jeg gjør det.

Løsning

Returverdien lagres i $?. 0 indikerer suksess, andre indikerer feil.

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

Som enhver annen tekstverdi kan du lagre den i en variabel for fremtidig sammenligning:

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

For mulige sammenligningsoperatorer, se man test.

Kommentarer (9)

Hvis du bare trenger å vite om kommandoen lyktes eller mislyktes, trenger du ikke å teste $?, bare test kommandoen direkte. F.eks:

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

Og å tilordne utdata til en variabel endrer ikke returverdien (vel, med mindre den oppfører seg annerledes når stdout ikke er en terminal selvfølgelig).

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

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals forklarer if i mer detalj.

Kommentarer (2)

$? skal inneholde avslutningsstatusen for den forrige kommandoen, som skal være null for ingen feil.

Så noe sånt som

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

for de fleste tilfeller, det's lettere å bruke && konstruksjon for å kjede kommandoer som trenger å avhenge av hverandre. Så cd /nonexistent && ekko suksess! ville ikke ekko suksess fordi kommandoen bryter før &&. Følgen av dette er ||, der cd /nonexistent || echo fail ville echo fail fordi cd mislyktes. (dette blir nyttig hvis du bruker noe som ||exit, som vil avslutte skriptet hvis den forrige kommandoen mislyktes).

Kommentarer (2)