Baru ;&
dan ;;&
operator yang diperkenalkan di Bash
4.0
dan meskipun mereka berdua mungkin berguna dalam situasi yang sama saya pikir mereka tidak berguna dalam kasus Anda. Inilah yang man bash
dikatakan tentang operator ini:
Jika;; operator digunakan, tidak ada kecocokan berikutnya yang dicoba setelah pencocokan pola pertama. Menggunakan; & sebagai pengganti ;; menyebabkan eksekusi untuk melanjutkan daftar yang terkait dengan set pola berikutnya. Menggunakan ;; & sebagai pengganti ;; menyebabkan shell untuk menguji daftar pola selanjutnya dalam pernyataan, jika ada, dan menjalankan daftar terkait pada pertandingan yang berhasil.
Dengan kata lain, ;&
adalah jatuh dan seperti yang kita tahu dari C
dan
;;&
membuat bash
memeriksa sisa kasus alih-alih kembali dari
case
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 :
#!/usr/bin/env bash
function jumpto
{
label=$1
cmd=$(sed -n "/$label:/{:a;n;p;ba};" "$0" | grep -v ':$')
cmd=$(echo "$cmd" | sed 's,;;,,')
cmd=$(echo "$cmd" | sed 's,esac,,')
eval "$cmd"
}
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
printf "perform fallthrough\n"
jumpto ft
else
printf "do not perform fallthrough\n"
fi
;;
*)
ft:
echo "fallthrough worked!"
;;
esac
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.