Нові ;&
та ;;&
оператори були представлені в Bash
4.0,
і хоча вони обидва можуть бути корисними в подібних ситуаціях, я думаю, що вони не мають користі у вашому випадку. Ось що man bash
говорить про цих операторів:
Якщо ;; Оператор використовується, наступні збіги не намагаються здійснити після першого узгодження шаблону. Використання; & замість ;; змушує виконання продовжувати список, пов'язаний із наступним набором шаблонів. Використання ;; & замість ;; змушує оболонку перевірити наступний список шаблонів у виписці, якщо такий є, та виконати будь-який асоційований список у успішному збігу.
Іншими словами, ;&
це провал і, як ми це знаємо, C
і
;;&
робить bash
перевірку решти випадків, а не повернення з
case
блоку цілком. Ви можете знайти хороший приклад ;;&
дії тут: /programming//a/24544780/3691891 .
Це, як було сказано, ні у вашому сценарії ;&
не ;;&
може бути використане, тому що вони обидва підуть на *)
те, що завжди буде запущено.
Наступний сценарій працює і робить все, що ви хочете, не переставляючи логіку, але вважайте це лише прикладом і ніколи не покладайтеся на нього, він занадто крихкий. Я взяв ідею
звідси :
#!/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
частини коду на все, що знаходиться*)
? Оскільки це абсолютно не відрізняється від того, що називається підсумком, таким чином, роблячи ваше питання фразування просто злегка оманливим.