Yeni ;&
ve ;;&
operatörler
4.0'da tanıtıldıBash
ve her ikisi de benzer durumlarda yararlı olsa da, sizin durumunuzda hiçbir faydası olmadığını düşünüyorum. Bu man bash
operatörler hakkında söylenenler:
Eğer ;; operatörü kullanıldığında, ilk patern eşleşmesinden sonra hiçbir eşleşme denenmez. Kullanımı; & yerine ;; yürütmenin bir sonraki kalıp kümesiyle ilişkili listeyle devam etmesine neden olur. ;; yerine; kabuğun deyimdeki bir sonraki kalıp listesini test etmesine ve varsa başarılı bir eşleşmede ilişkili listeyi yürütmesine neden olur.
Başka bir deyişle, ;&
üzerinden bir düşüş olduğunu ve gelen bildiğimiz C
ve
;;&
markaları bash
davaları kalan yerine dönen kontrol
case
tamamen bloğun. ;;&
Eylem için güzel bir örnek burada bulabilirsiniz: https://stackoverflow.com/a/24544780/3691891 .
Bununla birlikte, senaryonuzda ;&
ne ;;&
kullanılabilir ne de kullanılamaz çünkü ikisi de gidecekti, *)
her zaman çalıştırılacaktı.
Aşağıdaki komut dosyası mantığı yeniden düzenlemeden çalışır ve istediğinizi yapar, ancak yalnızca örnek olarak düşünün ve asla ona güvenmeyin, çok kırılgandır. Fikri buradan aldım
:
#!/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
Kodun bir kısmından içinde ne varsa atlamaya mı çalışıyorsunuz*)
? Çünkü bu, tam olarak adlandırılandan tamamen farklıdır, bu nedenle sorunuzun ifadesini biraz yanıltıcı hale getirir.