caseest uniquement pour la correspondance de modèles, il ne fera pas d'évaluation arithmétique (sauf peut-être si vous considérez zshl' <x-y>opérateur de correspondance de modèles étendu). Le [...]ne correspond qu'à un seul caractère (ou élément d'assemblage dans certaines implémentations) en fonction de l'ensemble spécifié dans. Ainsi , par exemple [0-80]correspondrait à un caractère si elle est l' un 0de 8ou 0(qui est l' un des 0, 1, 2, 3, 4, 5, 6, 7, 8).
Vous pouvez faire correspondre des nombres avec des modèles comme:
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
Mais vous pouvez facilement voir que ce n'est pas le bon outil.
Le [...]correspond à un caractère par rapport à la liste des caractères spécifiés, donc [121-300]correspond à tout caractère qui est soit 1, 2, 1 à 3, 0 ou 0, c'est donc la même chose que [0-3]ou [0123].
Utilisation:
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
Une autre façon d'utiliser caseserait comme:
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
Ou utilisez l'opérateur ternaire ( 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...
Ou comme @mikeserv, sortez des sentiers battus, inversez la caselogique et1 comparez avec la valeur de ces comparaisons arithmétiques .
if [ n < 0 ] - elif [ n <= 80 ] - elif [ n <= 100 ] ... - else. Moins de frappe, moins sujet aux erreurs.