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 :

Commande "if" dans un script - OK ou NOK


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2014
    Messages : 30
    Par défaut Commande "if" dans un script - OK ou NOK
    Bonjour à tous,

    Voici mon 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
     
    # Boucle sur base client
    FILE=$(cat /sauvegardes/client.csv)
    echo $FILE
     
    for var in $FILE ;do
    	CLIENT=`echo $var | awk -F";" '{ print $1 }'`
    	IP=`echo $var | awk -F";" '{ print $2 }'`
    	LOGIN=`echo $var | awk -F";" '{ print $3 }'`
    	PASS=`echo $var | awk -F";" '{ print $4 }'`
    echo "${CLIENT}" "${IP}" "${LOGIN}" "${PASS}"
     
    # Creation fichier de LOG
    touch $log
    echo ""$date" - Téléchargement de config.conf sur "$IP"  en "$jour"_"$CLIENT".conf" >> $log
     
    # Transfert FTP de config.conf
    ftp -n << EOF
    open $IP $PORT
    quote USER $LOGIN
    quote PASS $PASS
    bin
    cd conf
    get config.conf
    bye
    EOF
     
    # Déplacement et Renommage du fichier de configuration
    mv config.conf /sauvegardes/"$jour"_"$CLIENT".conf
     
    done
    Mon souhait est d'indiquer dans les logs que:
    - Si le fichier de config a été téléchargé -> indiquer dans les logs que c'est OK
    - Si le fichier de config n'a pas été téléchargé -> indiquer dans les logs que c'est NOK

    Je sais qu'il existe la commande "if" mais je bloque pour l'introduire dans mon script.

    Avez-vous svp la possibilité de m'aiguiller ?

    Merci d'avance.

    Cdt,
    Laurent

  2. #2
    Membre confirmé Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Par défaut
    Salut Laurent,

    Regarde sur mon post, tu devrais avoir des réponses à tes questions : http://www.developpez.net/forums/d14...e/#post7835087

    Regarde la première réponse de BufferBob, 2ème solution.

    Pour mon cas, la condition est que le fichier existe.

    En espérant t'avoir aidé !

  3. #3
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Plusieurs remarques :

    1) if n'est pas une commande mais une instruction shell, une instruction bash dans votre cas.

    2) Pour ce genre de découpage, awk n'est pas utile. Un simple cut pourrait suffire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CLIENT=$(echo $var | cut -d":" -f1)
    IP=$(echo $var | cut -d":" -f2)
    LOGIN=$(echo $var | cut -d":" -f3)
    PASS=$(echo $var | cut -d":" -f4)
    Toutefois dans votre cas, ce n'est pas non plus la solution, il est préférable de changer de boucle et d'IFS : lire la FAQ à ce sujet.

    Du coup ça donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while IFS=':' read -ra array; do 
        CLIENT="${array[0]}"
        IP="${array[1]}"
        LOGIN="${array[2]}"
        PASS="${array[3]}"
        #...
    done < /sauvegardes/client.csv
    Bien sûr, vous n'êtes pas obligé de passer par des variables tampons et manipuler le tableau directement. Vous pouvez également opter pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while IFS=':' read -r CLIENT IP LOGIN PASS POUBELLE; do 
         # ...
    done < /sauvegardes/client.csv
    La variable "$POUBELLE" contiendra le reste de la ligne parcourue s'il y a plus de 4 champs.

    3) Pour répondre à votre question, tester si le fichier existe et s'il n'est pas vide devrait convenir à votre besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ -f fichier && "$(cat fichier)" ]] && echo "OK" >> "$log" || echo "NOK" >> "$log"
    Ici je n'est pas utilisé if mais l'instruction [[ qui est l'équivalent d'un test (ou [) amélioré.

    Bien entendu vous pouvez aussi passer par une structure if mais toujours à l'aide de [[ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if [[ -f fichier && "$(cat fichier)" ]]; then
        # ...
    else
        # ...
    fi
    • -f va tester si le fichier existe et s'il s'agit d'un fichier régulier (capable de stocker de la donnée : txt, csv, xml, tar, zip, etc)
    • "$(cat fichier)" équivaut au test -n "$(cat fichier)" qui test que la chaine "$(cat fichier)" est non vide


    Au lieu de -n, vous avez également -s fichier qui permet de vérifier qu'un fichier ou répertoire existe et que sa taille est différente de 0. Ce test pourrait également convenir à votre situation (voire est préférable s'il s'agit d'un fichier volumineux).

    man bash pour en savoir plus

    Et un peu de lecture :

    Quelques bonnes pratiques dans l'écriture de scripts en Bash
    FAQ : Comment lire/parcourir un fichier ?
    FAQ : Pourquoi faut-il éviter d'utiliser la boucle for sur une sortie de commande ?

    Et pour approfondir votre connaissance du shell : cours complet sur le shell

    Cordialement,
    Idriss

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Citation Envoyé par ok.Idriss
    tester si le fichier existe et s'il n'est pas vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ help test
    [...]
           -s FILE        True if file exists and is not empty.
    [...]
    il est préférable de changer de boucle et d'IFS
    merci.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut


    J'avais également indiqué l'option -s dans ma réponse précédente mais en la définissant plutôt par rapport au man bash :

    -s file
    True if file exists and has a size greater than zero.
    =>

    Citation Envoyé par ok.Idriss Voir le message
    Au lieu de -n, vous avez également -s fichier qui permet de vérifier qu'un fichier ou répertoire existe et que sa taille est différente de 0. Ce test pourrait également convenir à votre situation (voire est préférable s'il s'agit d'un fichier volumineux).
    Ceci étant, ça revient effectivement à dire que le fichier n'est pas vide
    Et "différente de 0" est inexact, j'aurais du dire "plus grande que 0"

    Idriss

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    J'avais également indiqué l'option -s dans ma réponse précédente
    [mauvaise foi] ah, oui ?! mais, c'était écrit en tout petit. [/mauvaise foi]
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2014
    Messages : 30
    Par défaut
    En tout cas merci à vous !!!!

    Avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [[ -f fichier && "$(cat fichier)" ]] && echo "OK" >> "$log" || echo "NOK" >> "$log"
    Ça marche nikel !!!

    Voici le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [[ -f /repertoire/"$jour"_"$CLIENT".conf && "$(cat /repertoire/"$jour"_"$CLIENT")" ]] && echo "OK - "$date" - Téléchargement de config.conf sur "$IP"  en "$jour"_"$CLIENT".conf" >> $log || echo "NOK - "$date" - Téléchargement échoué sur "$IP"  pour le client "$CLIENT"" >> $log

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    c'est confirmé, tu as du goût pour les solutions les plus "complexes".
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Re bonjour.

    Citation Envoyé par lorenzo8769 Voir le message
    Ça marche nikel !!!
    Tant mieux, mais ça marcherait bien plus efficacement si tu suivais l'ensemble de nos conseils notamment :

    1) utiliser -f et -s au lieu de -f et "$(cat fichier)", je suis d'accord avec N_Bah c'est plus adapté dans cette situation (je regrette un peu d'avoir proposé l'autre solution aussi mais j'avais d'abord pensé que ce serait utile pour toi de savoir comment tester si une chaine est vide ou non).

    2) privilégier la boucle while avec le changement d'IFS plutôt que de faire un for sur le résultat d'un cat avec un tas de awk en prime (ce qui est plus couteux car tu passe par des programmes externes inutilement et plus risqué dans le cas ou tes lignes contiendrait des espaces).

    Bon le point 1) c'est pas bien grave. Moi aussi j'ai tendance à faire ça parce que je suis parano (-f pour être sûr qu'il s'agit d'un fichier régulier et me baser sur le contenu du fichier plutôt que sur sa taille) => mais c'est de la paranoïa souvent inutile (comme dans le cas présent)

    Le point 2) en revanche, c'est très important de le mettre en pratique et prendre des bonnes habitudes : éviter de faire inutilement appel à des programmes externes qui peuvent être couteux et surtout maitriser les risques et rendre ses scripts robustes.

    Cordialement,
    Idriss

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    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 831
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par ok.Idriss Voir le message
    (je regrette un peu d'avoir proposé l'autre solution aussi mais j'avais d'abord pensé que ce serait utile pour toi de savoir comment tester si une chaine est vide ou non).
    Euh... test -n/-z "chaine" (c'est aussi dans le man)...

    Citation Envoyé par lorenzo8769 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ -f /repertoire/"$jour"_"$CLIENT".conf && "$(cat /repertoire/"$jour"_"$CLIENT")" ]] && echo "OK - "$date" - Téléchargement de config.conf sur "$IP"  en "$jour"_"$CLIENT".conf" >> $log || echo "NOK - "$date" - Téléchargement échoué sur "$IP"  pour le client "$CLIENT"" >> $log
    Tu sais que tu peux améliorer la mise en forme de ton script ? Un script efficace c'est bien, un script efficace et agréable à relire (voire à modifier) c'est mieux...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [[ -f /repertoire/"$jour"_"$CLIENT".conf && "$(cat /repertoire/"$jour"_"$CLIENT")" ]]\
        && echo "OK - "$date" - Téléchargement de config.conf sur "$IP"  en "$jour"_"$CLIENT".conf" >> $log\
        || echo "NOK - "$date" - Téléchargement échoué sur "$IP"  pour le client "$CLIENT"" >> $log
    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]

  11. #11
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut


    Citation Envoyé par Sve@r Voir le message
    Euh... test -n/-z "chaine" (c'est aussi dans le man)...
    J'ai pas dit le contraire

    Par contre j'ai trouvé utile de préciser que test "chaine" == test -n "chaine". Après comme il s'agit d'un fichier à la base, je suis d'accord avec N_Bah dans la mesure ou -s est un peu plus adapté (ça évite de lire le contenu du fichier en passant par une commande comme cat).

    Idriss

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

Discussions similaires

  1. [PowerShell] double quotes et variables dans une ligne de script Powershell
    Par Aenean dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 08/12/2014, 17h55

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