Di sini ia menunjukkan untuk menggunakan ||
dan &&
dalam satu baris untuk menyatukan eksekusi perintah: Bagaimana saya bisa memeriksa kesalahan apt-get dalam skrip bash?
Saya mencoba menghentikan eksekusi skrip jika kondisi tertentu gagal,
misalnya
false || echo "Obvious error because its false on left" && exit
Di sini ia mencetak Obvious error because its false on the left
dan keluar dari konsol yang saya inginkan.
true || echo "This shouldn't print" && exit
Di sini, tidak ada cetak gema tetapi exit
perintah juga berjalan, yaitu konsol ditutup, bukankah exit
perintah tidak berjalan karena perintah gema di sebelah kanan tidak dijalankan? Atau apakah secara default pernyataan dianggap salah di sisi kiri &&
operator?
Sunting: Seharusnya saya sebutkan sebelumnya, tujuan saya adalah untuk mengulang kesalahan dan keluar jika tidak jelas. WRT ke kasus spesifik saya menangkap kesalahan ketika pengelompokan kondisi menggunakan && dan ||, @ bodhi.zazen jawaban memecahkan masalah.
Jawaban @takatakatek membuatnya lebih jelas tentang kontrol aliran dan tautan panduan bash sangat baik
@muru jawaban memiliki penjelasan yang baik tentang mengapa tidak menggunakan set -e jika Anda ingin pesan kesalahan khusus dilemparkan dengan alternatif menggunakan perl dan trap yang saya pikir merupakan cara yang lebih kuat dan lihat sendiri menggunakannya dari skrip bash kedua saya dan seterusnya!
sumber
Jawaban:
Anda mungkin ingin (seperti yang ditunjukkan oleh steeldriver)
Kalau tidak, skrip Anda membaca satu kondisional pada suatu waktu
a atau b dan kemudian keluar
Saya pikir Anda ingin a atau (b dan keluar)?
sumber
{ ... ; }
(seperti yang disarankan @steeldriver), atau yangexit
hanya keluar dari subkulit, dan shell induk terus menjalankan skrip.Masalahnya adalah bahwa || dan && hanya melewatkan satu bait berikutnya dari rantai perintah ketika kondisinya gagal. Jika Anda menulis struktur blok penuh itu masuk akal. Apa yang Anda tulis menjadi ini:
Yang Anda inginkan adalah ini:
Ketika Anda menggunakan operator kondisional pintas Bash, lebih baik untuk tidak mencampurnya. Logikanya jauh lebih mudah dimengerti saat Anda menulisnya, dan pembaca Anda akan menghargai gaya Anda yang baik.
sumber
if ... then ... elif ... else ... fi
blok yang diekspresikan sepenuhnya . Saya menduga Anda mungkin tidak menyadari bahwa Bash tidak memiliki tipe boolean sejati yang terlihat dalam bahasa yang lebih canggih. Jika status keluar dari perintah adalah 0 (nol), Bash memperlakukan itu sebagai benar / sukses . Jika status keluar tidak nol, Bash memperlakukannya sebagai salah / gagal .Cara termudah untuk gagal pada kesalahan adalah dengan menggunakan
-e
opsi bash (set -e
atau/bin/bash -e
di shebang). Namun, ini tidak membuatnya mudah untuk mengirim pesan kesalahan khusus. Ada beberapa idiom yang mungkin membuatnya lebih sederhana:die
à la PerlPerl memiliki
die
perintah yang sangat mudah untuk mencetak pesan ke stderr dan memunculkan pengecualian, yang biasanya mengarah ke penghentian skrip. Anda dapat meniru ini:trap
ERR
The
trap <command>
perintah dapat digunakan untuk menjalankan perintah ketika sinyal yang diterima, atau saat keluar script (trap ... EXIT
), atau ketika perintah mengembalikan kesalahan (trap ... ERR
). Jadi sesuatu seperti:Kemudian:
Dalam kedua kasus, saya sarankan menggunakan setidaknya
exit 1
, untuk menunjukkan bahwa skrip gagal . Plainexit
akan menggunakan status keluar dari perintah sebelumnya, yang dalam kasus ini akan menjadiecho
atauprintf
perintah, yang biasanya akan berhasil. Menyimpan status keluar dari perintah gagal seperti yang saya lakukan di sini akan menyenangkan.sumber
Anda dapat mencoba sedikit bereksperimen dengan memulai skrip
-E memastikan bahwa skrip keluar saat sesuatu mengembalikan false. Kegagalan spesifik kemudian dapat dihindari dengan
something || true
sumber