Подтвердить что ты не робот

Процитировать дело?

В популярных императивных языках операторы switch обычно "проваливаются" на следующий уровень после сопоставления case-оператора.

Пример:

int a = 2;
switch(a)
{
   case 1:
      print "quick ";
   case 2: 
      print "brown ";
   case 3: 
      print "fox ";
      break;
   case 4:
      print "jumped ";
}

напечатал бы "коричневую лисицу".

Однако тот же код в bash

A=2
case $A in
2)
  echo "QUICK"
  ;&
2)
  echo "BROWN"
  ;&
3)
  echo "FOX"
  ;&
4)
  echo "JUMPED"
  ;&
esac

печатает только "BROWN"

Как заставить оператор case в bash "провалиться" на остальные условия, такие как первый пример?

(изменить: bash версия 3.2.25, оператор & (из wiki) приводит к синтаксической ошибке)

работает:

test.sh:

#!/bin/bash
A=2
case $A in
1)
  echo "QUICK"
  ;&
2)
  echo "BROWN"
  ;&
3)
  echo "FOX"
  ;&
esac

дает:

./test.sh: строка 6: синтаксическая ошибка около неожиданного токена ;' ./test.sh:
line 6:
; & '

4b9b3361

Ответ 1

Операторы ;& и ;;& были введены в bash 4.0, поэтому, если вы хотите придерживаться пятилетней версии bash, вам придется либо повторить код, либо использовать if s.

if (( a == 1)); then echo quick; fi
if (( a > 0 && a <= 2)); then echo brown; fi 
if (( a > 0 && a <= 3)); then echo fox; fi
if (( a == 4)); then echo jumped; fi

или найти другой способ достижения фактической цели.

(На боковой ноте не используйте все имена переменных верхнего регистра. Вы рискуете перезаписать специальные переменные оболочки или переменные среды.)

Ответ 2

Попробуйте следующее:

case $VAR in
normal)
    echo "This doesn't do fallthrough"
    ;;
fallthrough)
    echo -n "This does "
    ;&
somethingelse)
    echo "fall-through"
    ;;
esac

Ответ 3

Использование ;& не очень переносимо, так как требует bash (не ash, dash или real sh) и требует как минимум bash 4.0 или новее (доступно не во всех системах).

Обход, который я считаю гораздо приятнее читать, чем много циклов if is и изменить регистр var:

#!/bin/sh

A=2
A_BAK=$A
while [ -n "$A" ]; do
    case $A in
        1)
            echo "QUICK"
            A=2
            ;;

        2)
            echo "BROWN"
            A=3
            ;;

        3)
            echo "FOX"
            A=4
            ;;

        4)
            echo "JUMPED"
            A=""
            ;;
    esac
done
A=$A_BAK