Saya mencari sintaks yang benar dari pernyataan switch dengan kasus fallthrough di Bash (idealnya case-insensitive). Dalam PHP saya akan memprogramnya seperti:
switch($c) {
case 1:
do_this();
break;
case 2:
case 3:
do_what_you_are_supposed_to_do();
break;
default:
do_nothing();
}
Saya menginginkan hal yang sama di Bash:
case "$C" in
"1")
do_this()
;;
"2")
"3")
do_what_you_are_supposed_to_do()
;;
*)
do_nothing();
;;
esac
Ini entah bagaimana tidak berfungsi: fungsi do_what_you_are_supposed_to_do()
harus diaktifkan ketika $ C adalah 2 ATAU 3.
bash
switch-statement
Mischka
sumber
sumber
function fname { echo "Inside fname"; return 0; }
ataufname() { echo "inside fname"; return 0; }
menempatkan parens pada panggilan fungsi dapat terlihat seperti definisi fungsi. Fungsi harus disebut seperti program baris perintah lain sepertimv
,cp
,rsync
,ls
,cd
, dll ... Dalam hal ini kita sebut fname suka begitu:fname $ARGS
.do_nothing()
haruskah pernyataan SKIP? Gunakan:
.Jawaban:
Gunakan bilah vertikal (
|
) untuk "atau".sumber
[23])
do_what_you_are_supposed_to_do()
, runtuh baik "2" dan "3" menjadi satu kasus gagal untuk mengatasi ini. Saya tidak yakin apakah mengedit pertanyaan agar lebih jelas ini masuk akal, karena sudah jelas bahwa banyak orang menganggap jawaban ini bermanfaat.break
dalam kode php.) Mengedit pertanyaan, atau judulnya, pada tanggal ini akan membatalkan banyak jawaban yang tidak memberikan jatuh-melalui logika, dan mungkin tidak harus dilakukan. Fall-through tidak dalam judul sampai beberapa suntingan oleh pengguna lain, tetapi sudah terlambat untuk mengambilnya kembali sekarang.bash
Versi terbaru memungkinkan fall-through dengan menggunakan;&
sebagai pengganti;;
: mereka juga memungkinkan melanjutkan pemeriksaan kasus dengan menggunakan di;;&
sana.output sampel
sumber
;&
dan;;&
. Saya mengubah"24"
ke;;& # resume
dan mendapatkan hasil yang sama, jadi saya masih bertanya-tanya kapan Anda akan menggunakan;&
fallthrough.?4
untuk[13]4
membuatnya lebih jelas, dan untuk membuat perubahan Anda perubahan melanggar()
belakang nama fungsi di bash kecuali Anda ingin mendefinisikannya.[23]
untuk mencocokkan2
atau3
''
alih-alih""
Jika terlampir
""
, penerjemah (tidak perlu) mencoba untuk memperluas variabel yang mungkin dalam nilai sebelum pencocokan.Untuk pencocokan yang tidak sensitif dengan huruf besar-kecil, Anda dapat menggunakan kelas karakter (seperti
[23]
):Tetapi
abra
tidak mengenai kapan saja karena akan dicocokkan dengan kasus pertama.Jika perlu, Anda dapat menghilangkan
;;
dalam kasus pertama untuk melanjutkan pengujian untuk pertandingan dalam kasus-kasus berikut juga. (;;
melompat keesac
)sumber
case "${C,,}" in
jika kasing tidak penting;;
? Bukankah seharusnya kau gunakan;&
untuk fallthrough?;;
saya harus menggunakan;;&
jika saya ingin melanjutkan pengujian.do_wild_mysterious_things
menjadikan hari sayaCoba ini:
sumber
Jika nilainya bilangan bulat maka Anda dapat menggunakan
[2-3]
atau Anda dapat menggunakan[5,7,8]
untuk nilai yang tidak berkelanjutan.Jika nilainya adalah string maka Anda dapat menggunakan
|
.sumber
shift
pada akhirnya?shift
menghapus argumen pertama pada daftar argumen CLI. Pada dasarnya setiap iterasi dari loop ini selalu$1
digunakan untuk mendapatkan setiap argumen dari daftar argumen CLI dengan bantuanshift
.