Kaip patikrinti, ar komanda pavyko?

Ar yra koks nors būdas patikrinti, ar vykdant komandą įvyko klaida?

Pavyzdys :

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
}

Aš jau bandžiau tai padaryti, bet atrodo, kad tai neveikia. Aš nežinau, kaip tai padaryti.

Sprendimas

Grąžinama reikšmė saugoma $?. 0 reiškia sėkmę, kitos - klaidą.

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

Kaip ir bet kurią kitą tekstinę reikšmę, ją galite saugoti kintamajame, kad galėtumėte palyginti ateityje:

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

Apie galimus palyginimo operatorius žr. man test.

Komentarai (9)

Jei jums reikia žinoti tik tai, ar komanda pavyko, ar ne, nesivarginkite testuoti $?, tiesiog testuokite komandą tiesiogiai. Pvz:

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

O išvesties priskyrimas kintamajam nekeičia grąžinamos reikšmės (na, nebent ji elgiasi kitaip, kai stdout nėra terminalas, žinoma).

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

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals išsamiau paaiškina if.

Komentarai (2)

$? turėtų būti ankstesnės komandos išėjimo būsena, kuri turėtų būti lygi nuliui, jei klaidos nėra.

Taigi, pvz;

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

daugeliu atvejų paprasčiau naudoti && konstrukciją komandų, kurios turi priklausyti viena nuo kitos, grandinei. Taigi cd /nonexistant && echo success! nesukeltų sėkmės, nes komanda nutrūksta prieš &&. Iš to išplaukia ||, kai cd /nonexistant || echo fail *būtų echo fail, nes cd nepavyko. (tai tampa naudinga, jei naudojate ką nors panašaus į ||exit, kuris užbaigs scenarijų, jei ankstesnė komanda nepavyko).

Komentarai (2)