Υπάρχει κάποιος τρόπος να ελέγξετε αν υπάρχει σφάλμα κατά την εκτέλεση μιας εντολής;
Παράδειγμα :
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
}
Προσπάθησα ήδη να το κάνω αυτό, αλλά φαίνεται ότι δεν λειτουργεί. Δεν ξέρω πώς να το κάνω αυτό.
Η τιμή επιστροφής αποθηκεύεται στο $?
. Το 0 υποδηλώνει επιτυχία, τα άλλα υποδηλώνουν σφάλμα.
some_command
if [ $? -eq 0 ]; then
echo OK
else
echo FAIL
fi
Όπως κάθε άλλη τιμή κειμένου, μπορείτε να την αποθηκεύσετε σε μια μεταβλητή για μελλοντική σύγκριση:
some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
echo "Return code was not zero but $retval"
fi
Για τους πιθανούς τελεστές σύγκρισης, δείτε man test
.
Αν θέλετε να ξέρετε μόνο αν η εντολή πέτυχε ή απέτυχε, μην μπείτε στον κόπο να ελέγξετε το $?
, απλά ελέγξτε απευθείας την εντολή. Π.χ:
if some_command; then
printf 'some_command succeeded\n'
else
printf 'some_command failed\n'
fi
Και η ανάθεση της εξόδου σε μια μεταβλητή δεν αλλάζει την τιμή επιστροφής (καλά, εκτός αν συμπεριφέρεται διαφορετικά όταν το stdout δεν είναι τερματικό φυσικά).
if output=$(some_command); then
printf 'some_command succeded, the output was «%s»\n' "$output"
fi
Το http://mywiki.wooledge.org/BashGuide/TestsAndConditionals εξηγεί το if
με περισσότερες λεπτομέρειες.
Το $? θα πρέπει να περιέχει την κατάσταση εξόδου της προηγούμενης εντολής, η οποία θα πρέπει να είναι μηδέν για μηδενικό σφάλμα.
Έτσι, κάτι σαν,
cd /nonexistant
if [ $? -ne 0 ]
then
echo failed
else
echo success!
fi
για τις περισσότερες περιπτώσεις, είναι ευκολότερο να χρησιμοποιήσετε την κατασκευή && για να συνδέσετε αλυσιδωτά εντολές που πρέπει να εξαρτώνται η μία από την άλλη. Έτσι, η εντολή cd /nonexistant && echo success!
δεν θα δεν έβγαζε echo success επειδή η εντολή διακόπτεται πριν από την εντολή &&. Το επακόλουθο αυτού είναι το ||, όπου cd /nonexistant || echo fail
θα έδινε echo fail επειδή το cd απέτυχε. (αυτό γίνεται χρήσιμο αν χρησιμοποιείτε κάτι σαν ||exit, το οποίο θα τερματίσει το σενάριο αν η προηγούμενη εντολή απέτυχε).