Is er een manier om te controleren of er een fout is bij het uitvoeren van een commando?
Voorbeeld :
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
}
Ik heb dat al geprobeerd maar het lijkt erop dat het niet werkt. Ik weet niet hoe ik dat moet doen.
De terugkeerwaarde wordt opgeslagen in $?
. 0 duidt op succes, andere op een fout.
some_command
if [ $? -eq 0 ]; then
echo OK
else
echo FAIL
fi
Net als elke andere tekstuele waarde, kun je deze opslaan in een variabele voor toekomstige vergelijking:
some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
echo "Return code was not zero but $retval"
fi
Voor mogelijke vergelijkingsoperatoren, zie man test
.
Als je alleen wilt weten of het commando geslaagd of mislukt is, doe dan geen moeite om $?
te testen, maar test het commando rechtstreeks. Bijv:
if some_command; then
printf 'some_command succeeded\n'
else
printf 'some_command failed\n'
fi
En het toewijzen van de uitvoer aan een variabele verandert de terugkeerwaarde niet (nou ja, tenzij het zich anders gedraagt als stdout geen terminal is natuurlijk).
if output=$(some_command); then
printf 'some_command succeded, the output was «%s»\n' "$output"
fi
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals legt if
in meer detail uit.
$? moet de exit-status van het vorige commando bevatten, die nul moet zijn voor geen fout.
Dus, zoiets als;
cd /nonexistant
if [ $? -ne 0 ]
then
echo failed
else
echo success!
fi
In de meeste gevallen is het eenvoudiger om de && constructie te gebruiken om commando's aan elkaar te rijgen die van elkaar afhankelijk moeten zijn. Dus cd /nonexistant && echo success!
zou niet echo success zijn omdat het commando breekt voor &&. De consequentie hiervan is ||, waar cd /nonexistant || echo fail
zou echo fail echoën omdat cd mislukt is. (Dit is handig als je iets gebruikt als ||exit, dat het script beëindigt als het vorige commando mislukt is).