Bash регистр $var в нескольких обращениях
-
20-12-2019 - |
Вопрос
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
Не связан с StackOverflow