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 :

Boucle en bash avec creation de variable a la volé impossible a recuperer


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Par défaut Boucle en bash avec creation de variable a la volé impossible a recuperer
    Bonjour,

    je fait une creation de variable a la volé pour differencier toute mes version de la boucle et les reutilisé plus tard ..
    un expemple parle mieux .. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    export NB_CERT=0
    while read i
    do
            export  CERT_$NB_CERT="$i"
                        NB_CERT=$((NB_CERT+1))
    done < CERT.tmp
     
    while  [[ $NB_CERT -gt 0 ]]
    do
    echo $"CERT_$NB_CERT"
    done
    dans mon fichier CERT.tmp j'ai des noms :
    tazcox
    test1
    test2

    l'idee c'est de d'incrementé ma boucle avec le $NB_CERT et ensuite de lire toute les occurences en decrementant $NB_CERT
    mais le HIC c'est d'arrivé a afficher ma variable "CERT_0" alors que le echo ne m'affiche que "_0"

    mes variables sont bien setté mais comment les liree :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    bash-4.1$ while read i
    > do
    >         export  CERT_$NB_CERT="$i"
    >                     NB_CERT=$((NB_CERT+1))
    > done < CERT.tmp
    bash-4.1$
    bash-4.1$ env | grep CERT
    NB_CERT=2
    CERT_1=test1
    CERT_0=tazcox
    bash-4.1$NB_CERT=1
    bash-4.1$ echo $"CERT_$NB_CERT"
    CERT_1
    voila je n'arrive pas a afficher le contenue de CERT_1 avez vous une idée ?

    Merci

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    une solution à base de awk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ awk '{tab[++nb]=$1} END {nb--; printf("NB_CERT=%d\n", nb); for (i=nb; i; i--) {printf("CERT_%d=%s\n", i-1, tab[i])}}' CERT.tmp
    NB_CERT=2
    CERT_1=test1
    CERT_0=tazcox
    et une en bash des familles sur le même principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    readarray -t tab < CERT.tmp   # on stocke le fichier dans un tableau
    nb=${#tab[@]}                 # on récupère son nombre de lignes
    ((nb--))                      # -1
    echo "NB_CERT=${nb}"          # et on affiche...
    for ((i=$nb-1; i>=0; i--)); do
            echo "CERT_${i}=${tab[$i]}"
    done

  3. #3
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Par défaut
    Merci ,
    ca marche tres bien pour lister le contenue d'un fichier et attribué une variable incrementé a chaque ligne ..

    mais cela ne fonctionne pas pour mon cas .. je me suis mal exprimé pensant que c'etait une erreur de lecture de variable je n'ai pas mis tous le code que je fait ...(je voulais etre plus clair) ..mais finalement j'aurais mieux fait de donner le bout de code complet ..
    meaculpa

    voila le code complet .. :
    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
     
     while read i
     do
    ISSUER=`echo $i | grep Issuer`
     
    if [[ $ISSUER == "" ]]
    then
    DATE=`echo $i | awk '{print $4}' | cut -c 2-`
    DELTA=`./date_compare.pl $DATE` --> script qui compare deux date ..
    if [[ $DELTA -lt  60 ]]
            then
                    if [[ $DELTA -lt 5 ]]
                    then
            export  CERT_$NB_CERT="$i"
            export  CERTWEB_$NB_CERT="<B><font size="+1" color="red">CRITICAL the Certificat will be expire very soon !</font></B>"
            export  CERTIFICAT_STATUS=$((CERTIFICAT_STATUS+1))
                    else
            export  CERT_$NB_CERT="$i"
            export  CERTWEB_$NB_CERT="<B><font size="+1" color="yellow">Warning the Certificat will be expire soon !</font></B>"
            export  CERTIFICAT_STATUS=$((CERTIFICAT_STATUS+1))
                    fi
            else
            export CERT_$NB_CERT="$i"
                    echo $CERT\_$NB_CERT
            export CERTWEB_$NB_CERT="The next Expiration of Certificate will be in $DELTA days"
            export CERTIFICAT_STATUS=$((CERTIFICAT_STATUS+0))
    fi
                    NB_CERT=$((NB_CERT+1))
    else
            export ISSUER_$NB_CERT="$ISSUER"
    fi
    done < CERT.tmp
    while  [[ $NB_CERT -gt 0 ]]
    do
    echo $ISSUER\_$NB_CERT >> $LOG
    echo $CERT\_$NB_CERT >> $LOG
    echo $CERTWEB\_$NB_CERT >> $LOG
    NB_CERT=$((NB_CERT-1))
    done
    et voici le fichier CERT.tmp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $ cat CERT.tmp
    Issuer                : 'cn=1.1.1.1,o=My company,l=quebec,st=montreal,c=CA'
    Certificate Expires   : '2027-02-26 10:56:17 UTC'
    Issuer                : 'cn=TEst,o=TEst-Inc,st=montreal,c=CA'
    Certificate Expires   : '2027-03-01 09:54:36 UTC'
    Issuer                : 'cn=Test,o=Test-Inc,st=montreal,c=CA'
    Certificate Expires   : '2027-03-01 09:54:36 UTC'
    donc l'idée avec le fichier CERT.tmp c'est de ne traiter que les ligne qui sont Certificate Expires afin de comparé la date d'expiration avec la date du jour (date_compare.pl) et de stocker les informations (Issuer et Certificate dans une variable ) idealement un tableau mais je suis sous solaris et la commande readarray n'est pas dispo ..

    pour pouvoir ensuite
    afficher un status global sur l'etat des certificats ( CERTIFICAT_STATUS si proche de l'echeance alors "NOK" sinon "OK")
    et ensuite l'etat de chaque Issuer/Certificat :
    exemple :
    Certificat Status : OK
    Issuer : 'cn=1.1.1.1,o=My company,l=quebec,st=montreal,c=CA'
    Certificate Expires : '2027-02-26 10:56:17 UTC'
    The next Expiration of Certificate will be in 3524 days
    Issuer : 'cn=TEst,o=TEst-Inc,st=montreal,c=CA'
    Certificate Expires : '2027-03-01 09:54:36 UTC'
    The next Expiration of Certificate will be in 3540 days
    Issuer : 'cn=Test,o=Test-Inc,st=montreal,c=CA'
    Certificate Expires : '2027-03-01 09:54:36 UTC'
    The next Expiration of Certificate will be in 3540 days

    est ce que je suis plus clair ? ... sinon il y a l'option en PERL ou de passer par un fichier temporaire mais si il y avait un moyen de garder le shell ...

    Merci

  4. #4
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Par défaut
    Re bonjour,
    j'ai chercher suite a votre mail, comment faire un tableau en bash ...et j'ai trouvé

    voici le code modifié
    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
    CERTIFICAT_STATUS=0
    NB_CERT=1
     
    while read i
    do
        ISSUER=`echo $i | grep Issuer`
        if [[ $ISSUER == "" ]]
        then
            DATE=`echo $i | awk '{print $4}' | cut -c 2-`
            DELTA=`$LOCALDIR/date_compare.pl $DATE`
            if [[ $DELTA -lt  60 ]]
            then
                if [[ $DELTA -lt 5 ]]
                then
                    CERT[$NB_CERT]="$i"
                    CERTWEB[$NB_CERT]="<B><font size="+1" color="red">CRITICAL the Certificat will be expire very soon !</font></B>"
                    CERTIFICAT_STATUS=$((CERTIFICAT_STATUS+1))
                else
                    CERT[$NB_CERT]="$i"
                    CERTWEB[$NB_CERT]="<B><font size="+1" color="yellow">Warning the Certificat will be expire soon !</font></B>"
                    CERTIFICAT_STATUS=$((CERTIFICAT_STATUS+1))
                fi  
            else
                CERT[$NB_CERT]="$i"
                CERTWEB[$NB_CERT]="The next Expiration of Certificate will be in $DELTA days"
                CERTIFICAT_STATUS=$((CERTIFICAT_STATUS+0))
            fi  
            NB_CERT=$((NB_CERT+1))
        else
            ISSUER[$NB_CERT]="$ISSUER"
        fi  
    done < CERT.tmp
     
    if [[ CERTIFICAT_STATUS -ne 0 ]]
    then
        echo "Certificat HSM STATUS $RESULT_NOK" >> $LOG
    else
        echo "Certificat HSM STATUS $RESULT_OK" >> $LOG
    fi
     
    while [[ $NB_CERT -ge 0 ]]
    do
        echo ${ISSUER[$NB_CERT]} >> $LOG
        echo ${CERT[$NB_CERT]} >> $LOG
        echo ${CERTWEB[$NB_CERT]} >> $LOG
        NB_CERT=$((NB_CERT-1))
    done
    ca marche ....
    Merci de votre aide

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

Discussions similaires

  1. Script bash avec des variables mysql en boucle
    Par lorenzo8769 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 02/11/2015, 21h24
  2. [XL-2003] Boucle et division avec 2 variables.
    Par christoff916 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/07/2011, 16h38
  3. Creations de Variables avec %sysfunc(intck(...))
    Par suistrop dans le forum Macro
    Réponses: 2
    Dernier message: 01/06/2010, 17h29
  4. Boucle for avec SELECT et variable indicée
    Par hisin dans le forum Langage
    Réponses: 4
    Dernier message: 14/12/2009, 11h53
  5. probleme de récupération de variable en bash avec awk
    Par avogadro dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/12/2006, 01h31

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