Bir komutun yürütülmesinde hata olup olmadığını kontrol etmenin herhangi bir yolu var mı?
Örnek:
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
}
Bunu zaten denedim ama işe yaramıyor gibi görünüyor. Bunu nasıl yapacağımı bilmiyorum.
Dönüş değeri $?
içinde saklanır. 0 başarıyı, diğerleri hatayı gösterir.
some_command
if [ $? -eq 0 ]; then
echo OK
else
echo FAIL
fi
Diğer metinsel değerler gibi, bunu da ileride karşılaştırmak üzere bir değişkende saklayabilirsiniz:
some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
echo "Return code was not zero but $retval"
fi
Olası karşılaştırma operatörleri için man test
adresine bakın.
Sadece komutun başarılı olup olmadığını bilmeniz gerekiyorsa, $?
test etmekle uğraşmayın, sadece komutu doğrudan test edin. Örneğin:
if some_command; then
printf 'some_command succeeded\n'
else
printf 'some_command failed\n'
fi
Ve çıktıyı bir değişkene atamak dönüş değerini değiştirmez (stdout bir terminal olmadığında farklı davranmadığı sürece tabii ki).
if output=$(some_command); then
printf 'some_command succeded, the output was «%s»\n' "$output"
fi
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals if
ifadesini daha ayrıntılı olarak açıklamaktadır.
$? bir önceki komutun çıkış durumunu içermelidir; hata olmaması için bu değer sıfır olmalıdır.
Yani, şöyle bir şey;
cd /nonexistant
if [ $? -ne 0 ]
then
echo failed
else
echo success!
fi
Çoğu durumda, birbirine bağlı olması gereken komutları zincirlemek için && yapısını kullanmak daha kolaydır. Yani cd /nonexistant && echo success!
komutu && komutundan önce kesildiği için başarılı olarak yankılanmayacaktır. Bunun sonucu olarak cd /nonexistant || echo fail
komutu cd başarısız olduğu için *başarısız olarak yankılanacaktır. (eğer ||exit gibi bir şey kullanırsanız bu yararlı olur, eğer önceki komut başarısız olursa betiği sonlandırır).