Saya mencari cara agar fallthrough terjadi berdasarkan kondisi if dalam kondisi case di bash. Sebagai contoh:
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
# perform fallthrough
else
# do not perform fallthrough
fi
;;
*)
echo "fallthrough worked!"
;;
esac
Dalam kode di atas, jika variabelnya VAR
adalah 1
, saya ingin kondisi case melakukan fallthrough.
bash
shell-script
case
Smashgen
sumber
sumber
if [ $VAR -eq 1 ]; then
bagian kode ke apa pun yang ada di dalamnya*)
? Karena itu sama sekali berbeda dari apa yang disebut fallthrough, sehingga membuat kalimat pertanyaan Anda hanya sedikit menyesatkan.Jawaban:
Kamu tidak bisa Cara untuk
case
jatuh adalah mengganti;;
pemisah dengan;&
(atau;;&
). Dan itu adalah kesalahan sintaksis untuk memasukkannya ke dalam if.Anda dapat menulis seluruh logika sebagai persyaratan reguler:
sumber
if
.Saya sarankan merestrukturisasi logika Anda: alih-alih masukkan kode "fallthrough" ke dalam fungsi:
output
sumber
Script berikut mengubah tes Anda "dalam ke luar" dalam arti bahwa kami menguji
$var
terlebih dahulu dan kemudian melakukan fallthrough (menggunakan;&
dalam acase
) tergantung pada$input
.Kami melakukan ini karena pertanyaan apakah atau tidak untuk "melakukan fallthrough yang" benar-benar hanya tergantung pada
$input
jika$var
adalah1
. Jika ada nilai lain, pertanyaan apakah akan melakukan fallthrough bahkan tidak harus ditanyakan.Atau, tanpa
case
:sumber
*)
. Sudah memiliki +1 saya.Bukan sesuatu yang akan saya lakukan, tetapi Anda dapat mencapai sesuatu yang mendekati dengan:
sumber
Uji kedua variabel sekaligus (bash 4.0-alpha +):
Pada pengujian:
Bersih dan sederhana.
Memahami bahwa nilai yang diuji (
$new
) harus hanya memiliki dua nilai yang mungkin, itulah mengapa klausa if ada di sana, untuk mengubah VAR menjadi nilai Boolean. Jika VAR dapat dibuat menjadi Boolean, maka uji untuk0
(tidak1
) dicase
dan menghapusif
.sumber
Anda dapat menjadikan fallthrough sebagai default tetapi menempatkan suatu kondisi yang hanya dijalankan oleh kode jika kondisi terpenuhi
Tetapi seperti yang disarankan ilkkachu Anda juga dapat menggunakan kondisi daripada beralih.
sumber
Jika Anda tidak keberatan seseorang mengeluh tentang mereka yang tidak memahami kode Anda, Anda dapat dengan mudah mengubah urutan kedua persyaratan:
Atau:
Sederhana dan jelas (setidaknya bagi saya).
case
tidak mendukung fallthrough itu sendiri. Tetapi Anda dapat mengganti*)
dengan&&
afteresac
untuk menghormati nilai pengembalian cabang lain.sumber
Baru
;&
dan;;&
operator yang diperkenalkan diBash
4.0 dan meskipun mereka berdua mungkin berguna dalam situasi yang sama saya pikir mereka tidak berguna dalam kasus Anda. Inilah yangman bash
dikatakan tentang operator ini:Dengan kata lain,
;&
adalah jatuh dan seperti yang kita tahu dariC
dan;;&
membuatbash
memeriksa sisa kasus alih-alih kembali daricase
blok sepenuhnya. Anda dapat menemukan contoh;;&
aksi yang bagus di sini: /programming//a/24544780/3691891 .Yang sedang berkata, tidak satu pun
;&
tidak;;&
dapat digunakan dalam naskah Anda karena keduanya akan pergi ke*)
yang akan selalu berjalan.Script berikut ini berfungsi dan melakukan apa yang Anda inginkan tanpa mengatur ulang logika tetapi menganggapnya hanya sebagai contoh dan tidak pernah bergantung padanya, itu terlalu rapuh. Saya telah mengambil ide dari sini :
sumber
jumpto
fungsi dan menjalankan apa pun yang datang setelahnya. Fakta bahwa ini setara dengan melanjutkan eksekusi setelah blok antaraft:
dan;;
merupakan kebetulan karenajumpto
merupakan perintah terakhir dalam perintah kompleks yang sama dengan blok lompat-ke.