Новые операторы ;&
и ;;&
операторы были введены в 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
части кода к тому, что находится внутри*)
? Потому что это полностью отличается от того, что называется «прорыв», что делает ваш вопрос формулировочным, слегка вводящим в заблуждение.