Saya minta maaf sebelumnya jika ini adalah pertanyaan rangkap. Saya memang berusaha mencari / memeriksa sebelum bertanya di sini.
Saya nyaman menulis satu kalimat seperti ini:
foocommand && foocommand2 && foocommand3
Gagasannya adalah bahwa saya hanya ingin menjalankan perintah selanjutnya jika yang sebelumnya "berhasil".
Saya sedang menulis skrip yang agak panjang dan one-liner ini tidak layak karena terlihat seperti blok kode yang membingungkan bagi semua orang.
Saya ingin menghapus perintah dan menulis komentar di antara mereka dalam skrip. Bagaimana saya bisa melakukan ini dan masih memiliki yang setara dengan && di sana?
&&
tidak berarti perintah berikutnya akan berjalan jika sebelumnya satu berhasil. Ini berarti perintah akan berjalan jika hasil kolektif dari semua perintah sebelumnya dalam daftar perintah berhasil. Anda mungkin tahu ini, tetapi pembaca di masa depan mungkin salah paham.||
dan&&
(sebagai lawan|
atau&
) disebut hubungan pendek. Perilaku yang digunakan dengan operator terakhir disebut evaluasi bersemangat.a && b && c
hanya akan berjalanb
jikaa
berhasil, jadi "itu hanya berjalanc
jikab
berhasil" dan "itu hanya berjalanc
jikaa
danb
keduanya berhasil" adalah pernyataan yang setara:b
tidak dapat berhasil kecualia
berhasil.a || b && c
lebih ilustratif.true || false && echo hi
akan ditampilkanhi
. Spesifikasi berbunyi, Operator "&&" dan "||" harus memiliki prioritas yang sama dan harus dievaluasi dengan asosiasi kiri.Jawaban:
Anda bisa melakukannya seperti ini:
Saya harap saya mengerti apa yang Anda minta dengan benar.
sumber
Anda dapat mengubah garis shebang ke
Setelah kesalahan, skrip akan berhenti.
sumber
bash
bagian saja). Shell POSIX mengambil banyak opsi yang dapat diterapkanset
. Atau sebaliknya?set
adalah cara mengatur opsi baris perintah shell dalam skrip.-e
dapat berperilaku tidak benar. Misalnya, Anda mungkin tidak ingin skrip Anda dihentikan setiap kali Andadiff
dua file tidak identik. Anda dapat, tentu saja, mengatasi ini dengan menambahkan|| true
(atau mungkin|| [ $? = 1 ]
) ke perintah seperti itu, tetapi OP menyebutkan "orang lain" yang harus membaca skrip ini, dan mengatakan "orang lain" mungkin tidak akan terbiasa harus mengatasinya-e
.-e
di she-bang, sampai satu admin perusahaan saya terus meluncurkan skrip sayabash myscript.sh
, jadi mengabaikannya-e
. Sekarang semua skrip saya adaset -e
di baris kedua.Jika Anda tidak menyukai
set -e
ide itu, mungkin Anda dapat membalikkan logikanya.Lebih berguna, ganti
exit
dengan sesuatu untuk mencetak pesan kesalahan yang berguna, lalu keluar. Dalam fungsi, tentu saja, Anda inginreturn
bukanexit
.sumber
foocommand || exit
untuk keluar denganfoocommand
status keluar jika bukan nol.Anda dapat menggunakan
if else fi
blok sebagai gantinya.Ini sedikit lebih mudah dibaca.
Atau Anda bisa menggunakan
\
untuk membagi 1 liner besar Anda menjadi beberapa barisTapi tentu saja ini bisa membingungkan mata yang tidak terlatih.
sumber
\
tidak perlu di sana.Anda dapat mempertimbangkan untuk menggunakan
if
pernyataan bersarang . Pilihan lainnya adalah menggunakan curly's untuk kelompok suka{ true && echo hi; } || echo huh
Pembaruan 1:
Berikut ini contoh tanpa baris baru / komentar:
sumber
Pisahkan setiap urutan perintah menjadi fungsi:
sumber
Saya selalu suka menulis fungsi "gagal" yang memungkinkan saya menentukan hal yang akan saya lakukan ketika kegagalan terjadi dan kemudian menggunakan
||
pola. Seperti yang berikut ini:sumber