IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Variable non reconnue par "case"


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut Variable non reconnue par "case"
    Bonjour,

    j'écris un script Shell où j'utilise la fonction "case" mais elle ne reconnait pas la variable que je lui indique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    numPort=${type23: -2}
     
    case $numPort in
    			10)
    				echo "UTP MAU, half duplex mode"
    				;; 
                            *)
                                    echo "Pas de port"
                                    ;;
    esac
    Et cela me retourne :
    Même résultat si je mets :
    *
    et j'ai essayé en faisant un read , d'entrer la valeur "10" et cela m'affiche bien UTP MAU, half duplex mode.

    Est-ce que quelqu'un aurait une idée de la provenance de mon erreur? Je suis dessus depuis ce matin, et je galère totalement à trouver

    Merci à vous !

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Essaie d'ajouter cette ligne

    avant:


  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut
    Ça me retourne toujours la même chose : "Pas de port", alors que la variable $numPort vaut bien 16 .

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 338
    Par défaut
    Bonjour,
    Normal, 16 n'est pas egal à 10.

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Si la variable vaut 16, c'est normal que ton code te retourne "pas de port". Il faut que la variable contienne 10 pour que le premier "case" soit retenu.

    Et puis, il faudrait que tu nous expliques ce qui tu veux faire avec l'instruction :


  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut
    Oui désolé, je ne vous ai donné qu'une partie de mon code, donc voilà la partie qui m'intéresse pour que vous situiez mieux le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    type23=`grep "SNMPv2-SMI::mib-2.26.2.1.1.11.23.1 = OID: SNMPv2-SMI" typePortsRT` || "Pas de port 23"
     
     
    type23=$(echo $type23)
    numPort=${type23: -2}
     
    case $numPort in
    			10)
    				echo "UTP MAU, half duplex mode"
    				;; 
    			11)
    				echo "UTP MAU, full duplex mode"
    				;;
    			12)
    				echo "async fiber MAU, half duplex mode"
    				;;
    			13)
    				echo "async fiber MAU, full duplex mode"
    				;;
    			15)
    				echo "2 pair category 5 UTP, half duplex mode"
    				;;
    			16)
    				echo "2 pair category 5 UTP, full duplex mode"
    				;;
    			17)
    				echo "X fiber over PMT, half duplex mode" 
    				;;
    			18)
    				echo "X fiber over PMT, full duplex mode" 
    				;;
    			19)
    				echo "2 pair category 3 UTP, half duplex mode" 
    				;;
    			20)
    				echo "2 pair category 3 UTP, full duplex mode"
    				;;
    			22)
    				echo "PCS/PMA, unknown PMD, full duplex mode" 
    				;;
    			24)
    				echo "Fiber over long-wavelength laser, full duplex mode"
    				;;
    			26)
    				echo "Fiber over short-wavelength laser, full duplex mode"  
    				;;
    			30)
    				echo "Four-pair Category 5 UTP, full duplex mode"  
    				;;
    			*)
    				echo "Pas de port"  
    				;;
    	esac
    En fait mon but est de sortir les deux derniers caractères de $type23,
    lui même contenu dans typePortsRT :

    SNMPv2-SMI::mib-2.26.2.1.1.11.23.1 = OID: SNMPv2-SMI::mib-2.26.4.10
    SNMPv2-SMI::mib-2.26.2.1.1.11.24.1 = OID: SNMPv2-SMI::mib-2.26.4.10
    SNMPv2-SMI::mib-2.26.2.1.1.11.47.1 = OID: SNMPv2-SMI::mib-2.26.4.16
    SNMPv2-SMI::mib-2.26.2.1.1.11.48.1 = OID: SNMPv2-SMI::mib-2.26.4.16


    pour en déduire le type de port qui me sera donné par les possibilités qui sont dans ma fonction "case".

    Est-ce que c'est un peu plus clair comme ça ?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut
    C'est bon enfin !

    J'ai trouvé en me basant sur ta commande @jlliagre :

    il suffisait que je change la définition de $numPort -->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numPort=$(echo ${type23: -2})
    Et j'obtiens bien en lançant mon script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UTP MAU, half duplex mode
    Merci de m'avoir aidé, ça fait du bien de plus être bloqué sur ça !

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Oui, c'est plus clair avec toutes les infos !

    J'ai du mal à comprendre pourquoi le echo a un effet là où tu l'a mis car le but est de supprimer les espaces éventuels avant et après la chaîne, mais puisque tu prends les deux derniers et que ça marche, c'est qu'il n'y avait pas d'espace ...

    Enfin, si ton code fonctionne comme il faut, c'est l'essentiel ;-)

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    Bonjour,

    si c'est les deux derniers chiffres que tu veux tester dans case/esac, la substitution n'est pas nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case $var in
    *10) ...;;
    *16)...;;
    ...
    esac
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 338
    Par défaut
    Pour juste faire des echo, si on est en bash, autant passer par un tableau:
    Exemple (le $ est mon prompt) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ declare -A tab
    $ tab["10"]='UTP MAU, half duplex mode'
    $ tab["16"]='2 pair category 5 UTP, full duplex mode'
    $ var=10
    $ [ -n "${tab[$var]}" ] && echo ${tab[$var]}
    UTP MAU, half duplex mode
    $ var=11
    $ [ -n "${tab[$var]}" ] && echo ${tab[$var]}
    $ var=16
    $ [ -n "${tab[$var]}" ] && echo ${tab[$var]}
    2 pair category 5 UTP, full duplex mode
    Ici, il suffit juste d'alimenter le tableau, plus besoin de modifier le code...

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    pourquoi faire un tableau associatif avec des indices numériques ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 338
    Par défaut
    Comme ça, si je veux mettre une chaine de caractère (comme par exemple 2.14), cela fonctionne aussi.

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ici, il suffit juste d'alimenter le tableau, plus besoin de modifier le code...
    J'aime beaucoup la séparation code/données (ce qui peut paraître un peu inhabituel pour un vieux lispien).

    J'aime beaucoup quand les données sont représentées par... euh... des données...

    Il arrive bien souvent (trop, à mon goût) que du code (comme les clauses d'un "case") soit utilisé pour gérer un problème de données, avec, comme conséquence (comme le dit disedorgue) qu'une modification des données entraîne une modification du code.

    Je préfère quand les données sont gérées dans des fichiers de configuration.

    Ça permet, entre autres, de partager le même code avec des configurations différentes pour des environnements différents.

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 812
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par WarzAnthem Voir le message
    type23=$(echo $type23)
    Moi ce genre d'instruction me tourmente au plus haut point. Outre le fait qu'il y a peu d'utilité de remplacer "type23" par "ce que la commande echo $type23 affiche", on peut quand-même simplifier cette instruction en type23=$type23. Ce qui permet alors de mieux exposer son incongruïté..
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Moi ce genre d'instruction me tourmente au plus haut point. Outre le fait qu'il y a peu d'utilité de remplacer "type23" par "ce que la commande echo $type23 affiche", on peut quand-même simplifier cette instruction en type23=$type23. Ce qui permet alors de mieux exposer son incongruïté..
    Non, type23=$(echo $type23), ou mieux type23=$(echo -- $type23), peut modifier le contenu de la variable type23. Voir post #8.

    Cette instruction remplace toutes les occurrences successives d'espaces, tabulations et saut de lignes (IFS) par des espaces uniques, et supprime les espaces éventuellement présentes en début et fin de chaîne.

  16. #16
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par WarzAnthem Voir le message
    voilà la partie qui m'intéresse pour que vous situiez mieux le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type23=`grep "SNMPv2-SMI::mib-2.26.2.1.1.11.23.1 = OID: SNMPv2-SMI" typePortsRT` || "Pas de port 23"
    J'ai du mal avec cette instruction...

    Lorsque je crée un fichier "typePortsRT" sans la ligne indiquée (avec un "bash" sous macos (GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)) et non linux), il me répond (ce qui me paraît logique):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -bash: Pas de port 23: command not found
    J'imagine que tu voudrais utiliser "Pas de port 23" comme valeur par défaut au cas où la chaîne cherchée ne serait pas présente.

    Si c'est bien le cas, il vaudrait mieux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type23=`grep "SNMPv2-SMI::mib-2.26.2.1.1.11.23.1 = OID: SNMPv2-SMI" typePortsRT`
    type23=${type23:-"Pas de port 23"}

  17. #17
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 812
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Non, type23=$(echo $type23), ou mieux type23=$(echo -- $type23), peut modifier le contenu de la variable type23. Voir post #8.

    Cette instruction remplace toutes les occurrences successives d'espaces, tabulations et saut de lignes (IFS) par des espaces uniques, et supprime les espaces éventuellement présentes en début et fin de chaîne.
    Pas mal. Effectivement ça le fait.
    Mais bon, un petit commentaire explicatif ne serait pas du luxe. Parce que si quelqu'un derrière arrive pour blinder le script et qu'il écrit (ne serait-ce que) type23=$(echo "$type23") ben ça ne le fait plus.

    Alors autant je suis généralement partisan du "plus court chemin", autant ici je serais quand-même parti sur une instruction style type23="$(echo "$type23" |tr -d '[:space:]')" (ou une autre peut-être à base de "sed" ou "awk" si le fait que la suppression des espaces internes soit un souci) histoire d'être un peu plus clair...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Variable Non reconnue par ma Sub
    Par Kutoh dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 26/07/2013, 15h39
  2. [API]JTAPI non reconnu par eclipse
    Par julio84 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 15/04/2005, 14h03
  3. [Lomboz] [JBoss] JBoss 3.2.6 non reconnu par Lomboz ?
    Par romain3395 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 17/12/2004, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo