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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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