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 :

[Bash] Stocker un résultat dans plusieurs variable


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut [Bash] Stocker un résultat dans plusieurs variable
    Bonjour à tous,

    Je fais un petit script pour connecter l'état de mes équipements, sauf que je bloque pour traiter la donnée.

    Voici ce que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ID=$(snmpwalk -c $1 -v $2 $3 1.3.6.1.4.1.9.9.500.1.2.1.1.6 | awk -F "." '{print $NF}' | awk '{print $1}')
    ==> Cette commande me permet de connaitre le nombre d'élément que je dois superviser (nombre variable)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for element in $ID
            do
                    res=$(snmpwalk -c $1 -v $2 $3 1.3.6.1.4.1.9.9.500.1.2.1.1.6.$element)
                    valeur=$(echo $res | awk '{print $NF}')
    Et c'est la mon problème car le résultat est traité dans sa globalité, or j'aimerais pouvoir récupérer la sortie pour chacun de mes éléments.

    Voici le débug pour y voir plus clair :
    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
    ++ snmpwalk -c snmpget -v 2c 10.254.22.254 1.3.6.1.4.1.9.9.500.1.2.1.1.6
    ++ awk -F . '{print $NF}'
    ++ awk '{print $1}'
    + ID='1001
    2001
    3001
    4001'
    + for element in '$ID'
    ++ snmpwalk -c X -v X X.X.X.X 1.3.6.1.4.1.9.9.500.1.2.1.1.6.1001
    + res='RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.1001 = INTEGER: 4'
    ++ echo RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.1001 = INTEGER: 4
    ++ awk '{print $NF}'
    + valeur=4
    + echo 4
    4
    + for element in '$ID'
    ++ snmpwalk -c X -v X X.X.X.X 1.3.6.1.4.1.9.9.500.1.2.1.1.6.2001
    + res='RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.2001 = INTEGER: 4'
    ++ echo RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.2001 = INTEGER: 4
    ++ awk '{print $NF}'
    + valeur=4
    + echo 4
    4
    + for element in '$ID'
    ++ snmpwalk -c X -v X X.X.X.X 1.3.6.1.4.1.9.9.500.1.2.1.1.6.3001
    + res='RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.3001 = INTEGER: 4'
    ++ echo RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.3001 = INTEGER: 4
    ++ awk '{print $NF}'
    + valeur=4
    + echo 4
    4
    + for element in '$ID'
    ++ snmpwalk -c X -v X X.X.X.X 1.3.6.1.4.1.9.9.500.1.2.1.1.6.4001
    + res='RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.4001 = INTEGER: 4'
    ++ echo RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.4001 = INTEGER: 4
    ++ awk '{print $NF}'
    + valeur=4
    + echo 4
    En définitive ce que j'aimerais c'est que pour chacun de mes éléments (1001,2001,etc...) lui associer sa valeur.
    Dois-je forcement passer par un tableau ?

    Pour vous donner un idée, l'objectif du script est de remonter une alerte si un des éléments n'est pas égal au chiffre 4.

    Merci par avance,

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    Bonjour,

    Dois-je forcement passer par un tableau ?
    oui.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par musha76 Voir le message
    En définitive ce que j'aimerais c'est que pour chacun de mes éléments (1001,2001,etc...) lui associer sa valeur.
    Lui associer pendant combien de temps?

    Pour la vie? => écriture sur disque
    Pour la durée du script? => dans un tableau
    Pour la durée d'une itération de la boucle? => dans une variable locale


    Pour vous donner un idée, l'objectif du script est de remonter une alerte si un des éléments n'est pas égal au chiffre 4.
    Qu'entends-tu précisément par "remonter une alerte"?
    Afficher un message?
    Retourner un return status différent de 0?

    D'après cette information, tu peux faire quelque chose comme ceci (mélange code/pseudo-code basé sur la durée d'une itération, donc sans tableau), à améliorer!:

    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
    tout_ok := vrai
    liste_elements_avec_probleme := liste_vide
     
    for element in $ID
            do
                    res=$(snmpwalk -c $1 -v $2 $3 1.3.6.1.4.1.9.9.500.1.2.1.1.6.$element)
                    valeur=$(echo $res | awk '{print $NF}')
                    si valeur est_valeur_a_probleme (par exemple, égal à 4)
                    alors tout_ok := faux
                          liste_elements_avec_probleme += element
                    fin_si
            done
     
    si tout_ok == faux
    alors afficher liste_elements_avec_probleme
          retourner 1
    fin_si

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    J'aimerais lui associer pendant la durée du script, donc je vais déjà me pencher sur les tableaux

    Et j'entends par "remonter une alerte", afficher un message.

    Merci pour vos réponses!

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Dois-je forcement passer par un tableau ?
    Ben non. (Juste pour faire marronner N_BaH)

    Un fichier peut avoir la même fonction qu'un tableau avec la multi-dimensionnalité et la permanence en plus.

    2 fonctionnalités à considérer :


    Mais je n'ai pas compris le but ultime.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Merci pour votre aide! Je continue à travailler dessus ce soir

    Ne maîtrisant pas aussi bien que vous le langage bash, j'ai fais un script qui pour moi est fonctionnel ( désolé par avance s'il vous pique les yeux )

    Voici le script :
    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
    #!/bin/bash
     
    ### Nombre d'equipement dans le stack ###
    ID=$(snmpwalk -c $1 -v $2 $3 1.3.6.1.4.1.9.9.500.1.2.1.1.6 | awk -F "." '{print $NF}' | awk '{print $1}')
     
     
    ### Valeur pour chaque equipement ###
    for element in $ID
            do
                    res=$(snmpwalk -c $1 -v $2 $3 1.3.6.1.4.1.9.9.500.1.2.1.1.6.$element)
                    valeur=$(echo $res | awk '{print $NF}')
    	done
     
     
    ### Etat du stack ###
    numstack=$(echo "$ID" | cut -c1)
    	for test in $numstack
    		do
     
    			if [ $valeur -ne 4 ];then
    				echo "stack$test:NOK" >> stack_nok.txt
    			else
    				echo "stack$test:OK" >> stack_ok.txt
                            fi
            	done
     
     
    ### Sortie Centreon ###
    if [ -f "stack_nok.txt" ];then
            test1=$(cat stack_ok.txt | awk '{ printf("%s ",$1) }')
            test2=$(cat stack_nok.txt | awk '{ printf("%s ",$1) }')
            echo $test1 $test2 && rm stack_nok.txt && rm stack_ok.txt && exit 2
    else
            test3=$(cat stack_ok.txt | awk '{ printf("%s ",$1) }')
            echo $test3 && rm stack_ok.txt && exit 0
    fi

    Voici le débug:
    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
    55
    56
    57
    58
    59
    60
    ++ snmpwalk -c snmpget -v 2c X.X.X.X 1.3.6.1.4.1.9.9.500.1.2.1.1.6
    ++ awk -F . '{print $NF}'
    ++ awk '{print $1}'
    + ID='1001
    2001
    3001
    4001'
    + for element in '$ID'
    ++ snmpwalk -c X -v X X.X.X.X 1.3.6.1.4.1.9.9.500.1.2.1.1.6.1001
    + res='RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.1001 = INTEGER: 4'
    ++ echo RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.1001 = INTEGER: 4
    ++ awk '{print $NF}'
    + valeur=4
    + for element in '$ID'
    ++ snmpwalk -c X -v X X.X.X.X 1.3.6.1.4.1.9.9.500.1.2.1.1.6.2001
    + res='RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.2001 = INTEGER: 4'
    ++ echo RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.2001 = INTEGER: 4
    ++ awk '{print $NF}'
    + valeur=4
    + for element in '$ID'
    ++ snmpwalk -c X -v X X.X.X.X 1.3.6.1.4.1.9.9.500.1.2.1.1.6.3001
    + res='RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.3001 = INTEGER: 4'
    ++ echo RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.3001 = INTEGER: 4
    ++ awk '{print $NF}'
    + valeur=4
    + for element in '$ID'
    ++ snmpwalk -c X -v X X.X.X.X 1.3.6.1.4.1.9.9.500.1.2.1.1.6.4001
    + res='RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.4001 = INTEGER: 4'
    ++ echo RFC1155-SMI::enterprises.9.9.500.1.2.1.1.6.4001 = INTEGER: 4
    ++ awk '{print $NF}'
    + valeur=4
    ++ echo '1001
    2001
    3001
    4001'
    ++ cut -c1
    + numstack='1
    2
    3
    4'
    + for test in '$numstack'
    + '[' 4 -ne 4 ']'
    + echo stack1:OK
    + for test in '$numstack'
    + '[' 4 -ne 4 ']'
    + echo stack2:OK
    + for test in '$numstack'
    + '[' 4 -ne 4 ']'
    + echo stack3:OK
    + for test in '$numstack'
    + '[' 4 -ne 4 ']'
    + echo stack4:OK
    + '[' -f stack_nok.txt ']'
    ++ cat stack_ok.txt
    ++ awk '{ printf("%s ",$1) }'
    + test3='stack1:OK stack2:OK stack3:OK stack4:OK '
    + echo stack1:OK stack2:OK stack3:OK stack4:OK
    stack1:OK stack2:OK stack3:OK stack4:OK
    + rm stack_ok.txt
    + exit 0
    Pour information, j'ai un équipement qui peut être séparé en plusieurs éléments, chaque élément possède un état (valeur - chiffre 4).
    Si la valeur n'est pas égale à 4, cela veux dire que l'élément ne fais plus parti de l'équipement, et qu'il est donc HS.

    Pour cela, j'aimerais concevoir un script me sortant, sur une ligne, l'état de chaque élément de l'équipement.
    Par exemple :
    - stack1:OK stack2:OK stack3:OK stack4:OK
    - stack1:OK stack2:NOK stack3:OK
    - stack1:OK stack2:OK

    Je sais pas si cela est plus compréhensible pour vous.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    eh, Flo !



    musha76:
    UMQ -> Use More Quotes : les variables doivent toujours être entre guillemets. TOUJOURS; à moins de savoir pourquoi pas.
    UUOC -> Useless Use Of Cat : awk sait lire un fichier, même plusieurs...
    en effet, il n'est pas judicieux de perdre du temps en écriture disque si les données n'ont pas à être conservées entre les exécutions du script.

    ID pourrait être un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ids=( $(snmpwalk ... | awk '{n=split($0,tabl,"."); print tabl[n]}') )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in "${Ids[@]}"
    do
       : ...
    done
    je préfère test à [; c'est plus parlant.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Je n'ai pas tout lu attentivement, ni bien tout compris, ni même s'il y a une demande en cours, mais...
    je voudrais attirer ton attention sur un petit bug sur cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            echo $test1 $test2 && rm stack_nok.txt && rm stack_ok.txt && exit 2
    Si (cas improbable?) tous les équipements sont HS, alors le fichier "stack_ok.txt" ne sera pas créé, ce qui fait que l'instruction rm stack_ok.txt va échouer (no such file).
    Comme celle-ci est suivie du connecteur && et qu'elle échoue, alors l'instruction suivante exit 2 ne sera PAS exécutée et ton script va donc retourner un status 0... alors que tous les équipements sont HS !

    Àmha, il vaudrait mieux remplacer cette ligne par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            echo $test1 $test2
            rm -f stack_nok.txt
            rm -f stack_ok.txt
            exit 2
    PS: as-tu lu mon pseudo code qui semble avoir été apprécié et correspondre à ton besoin?

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Merci pour vos retours !

    Je pense rester sur ma structure car je l'a maîtrise mieux que les tableaux pour le moment.

    @jack-ft : Bien vu ! Je viens de corriger la syntaxe
    Oui, j'ai bien vu ton code.
    Je ne savais pas comment tout coder donc je m'en suis inspiré

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Sujet clos ! Merci !!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/05/2014, 11h58
  2. POO, stocker le résultat dans des variables
    Par nicolas2603 dans le forum Langage
    Réponses: 2
    Dernier message: 26/10/2012, 11h40
  3. Stocker des données dans plusieurs matrices différentes
    Par setsuko974 dans le forum Langage
    Réponses: 6
    Dernier message: 23/03/2007, 23h48
  4. Récupérer des valeurs dans plusieurs variables
    Par cortex024 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 26/01/2007, 15h33
  5. Stocker un noeud dans une variable
    Par Devotion dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 23/09/2004, 17h02

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