Вопрос

shopt -s extglob 
CONDITION1="@(*cheese*|*milk*|*cream*)"
CONDITION2="@(*potato*|*rice*|*pasta*)"

myvar1="pasta with cheese"

case ${myvar1} in
${CONDITION1} )
        echo DAIRY
        ;;
${CONDITION2} )
        echo CARBS
        ;;
* )
        echo HUNGRY
        ;;
esac

результат этого скрипта — echo DAIRY

Мне нужно изменить приведенный выше код, чтобы он отображал:Дневниковые углеводы

Это возможно?

Это было полезно?

Решение

Использовать ;;& вместо ;; если вы хотите такого поведения.

Тем не менее, провальное поведение будет означать, что вы получите HUNGRY безоговорочно.Я бы предложил установить флаг на совпадения и проверять его перед отправкой HUNGRY.

Так:

myvar1="pasta with cheese"; matched=0
case $myvar1 in
  *cheese*|*milk*|*cream*)
     echo DAIRY; matched=1 ;;&
  *potato*|*rick*|*pasta*)
     echo CARBS; matched=1 ;;&
esac
(( matched )) || echo HUNGRY

Тем не менее, было бы достаточно легко сделать этот код совместимым с POSIX sh, разбив его на несколько операторов case (и, опять же, не используя extglobs):

myvar1="pasta with cheese"; unset matched
case $myvar1 in *cheese*|*milk*|*cream*) echo DAIRY; matched=1 ;; esac
case $myvar1 in *potato*|*rick*|*pasta*) echo CARBS; matched=1 ;; esac
[ "$matched" ] || echo HUNGRY
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top