Как добиться провального поведения в операторах case в bash v3?

Я только что протестировал следующий синтаксис в Linux:

case "$OSTYPE" in linux-gnu*) ;;& linux*) echo $OSTYPE; ;; esac
case "$OSTYPE" in linux-gnu*) ;& linux*) echo $OSTYPE; ;; esac

который работает без каких-либо проблем (см.: Могут ли операторы case в bash каскадироваться? ) с GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu).

Но на OSX у меня есть следующие ошибки:

-bash: syntax error near unexpected token `&'
-bash: syntax error near unexpected token `;'

Это GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13).

Любые подсказки, как добиться такого же провального поведения на bash v3?

Является ли ваш код в первых строках просто образцом или реальным кодом, который вы хотите запустить?
Это готовый код копирования и вставки для запуска. Настоящий скрипт - это .bashrc в строках 58-59, которые закомментированы, потому что они не работают в OSX.

Ответы (1)

Либо обновите свой bash ( доморощенный ), либо вам придется перекодировать его, используя серию операторов if:

case "$OSTYPE" in linux-gnu*) ;;& linux*) echo $OSTYPE; ;; esac
case "$OSTYPE" in linux-gnu*) ;& linux*) echo $OSTYPE; ;; esac

было бы

# first case
if [[ $OSTYPE == linux-gnu* ]]; then
    : # nothing in this branch
fi 
if [[ $OSTYPE == linux* ]]; then
    echo $OSTYPE
fi

# second case
function print_ostype { echo $OSTYPE; }
if [[ $OSTYPE == linux-gnu* ]]; then
    # nothing in this branch
    # include the next branch
    print_ostype
elif [[ $OSTYPE == linux* ]]; then
    print_ostype
fi

Я использовал функцию во втором случае, чтобы уменьшить дублирование кода, если есть несколько операторов.

вы должны использовать :для пустой ветки... чистая # ...ошибка бросков;)