web-dev-qa-db-fra.com

Comment faire en sorte que la déclaration de cas corresponde à une plage de numéros?

J'utilise un cas de commutation avec des numéros de colonne pouvant aller de 0 à 50. Chaque cas prend désormais en charge le numéro de colonne discret et j'observe son échec.

Voici le code:

    i=10
    a=1
    b=0.65
    if [ "$a" != "$b" ]; then 
       case $i in  
            [1]|[2]|[5]) echo "Not OK"; ;; 
            [9-10]|[12]) echo "may be ok"; ;; 
            *) echo "no clue - $i"; ;; 
       esac
   fi

Je m'attends à ce que ce code produise may be ok Mais reçoive no clue - 10.

55
shamik

Bash case ne fonctionne pas avec les plages de nombres. [] est pour les modèles Shell.

par exemple ce cas [1-3]5|6) travaillera pendant 15, 25, 35 ou 6 ans.

Votre code devrait ressembler à ceci:

i=10
a=1
b=0.65
if [ "$a" != "$b" ] ; then
   case $i in
        1|2|5) echo "Not OK"; ;;
        9|10|12) echo "may be ok"; ;;
        *) echo "no clue - $i"; ;;
   esac;
fi

Si i peut être realentre 9 et 10, vous devrez utiliser if (au lieu de la casse) avec des plages.

99
Arnon Zilca

if et [ solution

arg=1
if [ "$arg" -lt 5 ]; then
  echo 'less than 5'
Elif [ "$arg" -lt 15 ]; then
  echo 'less than 15'
Elif [ "$arg" -eq 17 ] || [ "$arg" -eq 19 ]; then
  echo '17 or 19'
else
  echo 'neither'
fi

POSIX 7

Bash suit POSIX comme indiqué par https://stackoverflow.com/a/25482040/895245

Voici la citation: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 section "Construction conditionnelle à la casse":

Le cas de construction conditionnel exécutera la liste composée correspondant au premier de plusieurs modèles (voir Notation de correspondance de modèle) [...] Plusieurs modèles avec la même liste composée seront délimités par le caractère '|' symbole. [...]

Le format de la construction de cas est le suivant:

case Word in
     [(] pattern1 ) compound-list ;;
     [[(] pattern[ | pattern] ... ) compound-list ;;] ...
     [[(] pattern[ | pattern] ... ) compound-list]
  esac

et ensuite http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_1 La section "2.13. Notation de correspondance de modèle" dit:

[Si un crochet ouvert introduit une expression de crochet comme dans XBD RE Bracket Expression

et expressions rationnelles étendues pointe vers la section "9.3.5 Expression entre parenthèses RE" qui dit:

Une expression entre crochets (une expression entre crochets, "[]") est une ER qui doit correspondre à un ensemble spécifique de caractères uniques et peut correspondre à un ensemble spécifique d'éléments de classement multi-caractères, en fonction de l'ensemble non vide de liste les expressions contenues dans l'expression entre crochets.

Ainsi, seuls les caractères individuels sont considérés lorsque vous faites quelque chose comme:

[9-10]