Saya bertanya-tanya apa yang akan menjadi cara terbaik untuk memeriksa status keluar dalam pernyataan if untuk menggemakan output tertentu.
Saya sedang memikirkan itu
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
Masalah saya juga adalah bahwa pernyataan keluar sebelum pernyataan if hanya karena harus memiliki kode keluar itu. Juga, saya tahu saya melakukan sesuatu yang salah karena keluar jelas akan keluar dari program.
bash
shell
if-statement
error-handling
deadcell4
sumber
sumber
some_program; rc=$?; if [ ${rc} -eq 1 ] .... fi ; exit ${rc}
Jawaban:
Setiap perintah yang dijalankan memiliki status keluar.
Pemeriksaan itu melihat status keluar dari perintah yang selesai paling baru sebelum baris itu berjalan.
Jika Anda ingin skrip Anda keluar ketika tes itu kembali benar (perintah sebelumnya gagal) maka Anda memasukkan
exit 1
(atau apa pun) di dalamif
blok itu setelahecho
.Itu dikatakan jika Anda menjalankan perintah dan ingin menguji outputnya menggunakan yang berikut ini sering kali lebih mudah.
Atau untuk mengubahnya digunakan
!
untuk negasiPerhatikan bahwa tidak satu pun dari mereka yang peduli tentang kode kesalahan itu. Jika Anda tahu Anda hanya peduli pada kode kesalahan tertentu maka Anda perlu memeriksa
$?
secara manual.sumber
a_command || return 1
return
hanya berfungsi dalam fungsi dan skrip bersumber. Anda perluexit
untuk kasus lain (yang melakukan terlalu banyak fungsi dan skrip bersumber). Tapi ya, itu pasti pola yang masuk akal jika Anda tidak memerlukan pembersihan khusus atau output tambahan.dash
, shell non-interaktif default di banyak distribusi linux modern, tidak peduli dengan perbedaan antarareturn
danexit
di dalam skrip shell yang dieksekusi.dash
keluar dari skrip walaupun saya menggunakannyareturn
.if <command>
berlalu jika kode keluar adalah 0. Dalam bahasa lain itu akan menjadi sebaliknyaif ! some_command | some_other_command
akan mengabaikan status some_command. Dua penyelesaian perintah yang paling adalahset -o pipefail
(dapat mengubah fungsionalitas di bagian lain dari program Anda) atau untuk memindahkanif
pernyataan keif [[ ${PIPESTATUS[0]} -ne 0 ]]
sebagai perintah tindak lanjut yang terpisah (jelek, tetapi fungsional). Jika Anda menggunakanset -e
maka Anda juga akan ingin menambahkan|| true
ke ujung pipa ketika menggunakan solusi kedua karena menghapus pipa dari aliran kontrol yang ditawarkan olehif
jika tidak akan menyebabkannya untuk segera keluar.Perhatikan bahwa kode keluar! = 0 digunakan untuk melaporkan kesalahan. Jadi, lebih baik dilakukan:
dari pada
sumber
dnf check-update
mengembalikan 0 (tidak ada pembaruan), 100 (pembaruan tersedia) atau 1 (kesalahan).dnf
pengembang memilih cara ini, itu pilihan mereka. Tapi tetap saja, pilihan mereka tidak membuat spesifikasi menjadi rusak :)$?
adalah parameter seperti yang lainnya. Anda dapat menyimpan nilainya untuk digunakan sebelum akhirnya meneleponexit
.sumber
Alternatif untuk eksplisit
if
pernyataanMinimal:
test $? -eq 0 || echo "something bad happened"
Lengkap:
sumber
Hanya untuk menambah jawaban yang bermanfaat dan terperinci :
Jika Anda harus memeriksa kode keluar secara eksplisit, lebih baik menggunakan operator aritmatika
(( ... ))
,, dengan cara ini:Atau, gunakan
case
pernyataan:Jawaban terkait tentang penanganan kesalahan di Bash:
sumber