case
предназначен только для сопоставления с образцом, он не будет выполнять арифметическую оценку (за исключением, может быть, если учесть расширенный оператор сопоставления zsh
с <x-y>
образцом). [...]
Только , чтобы соответствовать один символ (или упорядочения элемент в некоторых вариантах осуществления) на основе набора , указанного внутри. Так, например , [0-80]
будет соответствовать один символ , если это один из 0
к 8
или 0
(то есть, один из 0, 1, 2, 3, 4, 5, 6, 7, 8).
Вы можете сопоставить числа с шаблонами, такими как:
case $(($number)) in
([0-9]|[1-7][0-9]|80) echo ">=0<=80";;
(8[1-9]|9[0-9]|100) echo ">=81<=100";;
... and so on
esac
Но вы можете легко увидеть, что это не тот инструмент.
[...]
Соответствует один символ против списка заданных символов, так [121-300]
спичек для любого символа, либо 1, 2, 1 до 3, 0 или 0, так что это так же , как [0-3]
и [0123]
.
Использование:
if [ "$number" -ge 0 ] && [ "$number" -le 80 ]; then
echo ">=0<=80"
elif [ "$number" -ge 81 ] && [ "$number" -le 100 ]; then
echo ">=81<=100"
elif ... and so on
...
fi
Другой способ использования case
будет выглядеть так:
case $((
(number >= 0 && number <= 80) * 1 +
(number > 80 && number <= 100) * 2 +
(number > 100 && number <= 120) * 3 +
(number > 120 && number <= 300) * 4)) in
(1) echo ">=0<=80";;
(2) echo ">=81<=100";;
(3) echo ">=101<=120";;
(4) echo ">=121<=300";;
(0) echo "None of the above";;
esac
Или используйте троичный оператор ( x ? y : z
):
case $((
number >= 0 && number <= 80 ? 1 :
number > 80 && number <= 100 ? 2 :
number > 100 && number <= 120 ? 3 :
number > 120 && number <= 300 ? 4 : 0)) in...
Или как @mikeserv, мыслить нестандартно, обратить case
логику и соответствие 1
со значением этих арифметических сравнений .
if [ n < 0 ] - elif [ n <= 80 ] - elif [ n <= 100 ] ... - else
. Меньше печатать, меньше подвержен ошибкам.На самом деле это действительно легко сделать. Дело в том,
case
что он всегда будет расширяться только настолько, насколько необходимо, чтобы найти первое совпадение с шаблоном. Это специальное поведение. И поэтому вы можете просто установить его с известной строкой и оценить расширения шаблонов.case
никогда не будет расширять эти паттерны больше, чем нужно, чтобы найти ведущую 1 в паттерне. Это особенно важно при работе с пользовательским вводом, потому что это означает, что вы можете безопасно проверить содержимое,$number
прежде чем пытаться поместить его в арифметический контекст расширения, в том же операторе case, в котором вы фактически поместили его в математическое расширение.источник
case
. есть некоторые интересные вещи, которые вы можете делать с$((
математикой))
иcase
- особенно с окружающими назначениями в шаблонах, которые никогда не происходят, пока в них нет необходимости - и вы даже можете создавать деревья разбора, которые расширяют вложенные рекурсии, если вы заполняете шаблоныalias
цепочкой. Это самый быстрый способ, который я нашел, чтобы заставить оболочку выполнять такие вещи, как перевод символов и менять символы на значения байтов. это может быть довольно быстро - C-Locale ASCII + <> восьмеричный худший случай - это 7 базовых расширений паттерна POSIX.Это не очень хорошо, но вы можете использовать это:
источник