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 :

Appel de sous-programmes dans un script Bash


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    Par défaut Appel de sous-programmes dans un script Bash
    Bonsoir à tous et à toutes,

    J'ai une petit script qui me permet de récupérer des sites Internet, en lftp, pour les sauvegarder.
    Pour en faciliter la lisibilité ainsi que la modularité, je voudrais le scinder en un programme principal et en autant de sous-programmes que de sites.

    J'ai donc fait ça :
    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
    #!/bin/bash
    #=========================================================================================
    # Récupérer les sites Internet via LFTP
    #=========================================================================================
    #utilisateur=abach
    DATE=`date +%Y%m%d_%H%M%S`
    destracine=/home/abach/En-cours/lftp
    fichierlog=recup_sites.log
    cd /home/$utilisateur/scripts
    clear
    # ====================================
    $home/scripts/recup_site_1.sh
    $home/scripts/recup_site_2.sh
    $home/scripts/recup_site_3.sh
    $home/scripts/recup_site_4.sh
    clear
    cat $fichierlog
    La première partie étant commune, je voudrais passer les variables 'DATE, destracines, fichierlog' aux sous-progammes mais manifestement, ça ne fonctionne pas aussi facilement que je ne le pensais...

    Auriez-vous une solution ?

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

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

    qu'est-ce qui différencie les scripts recup_site_[1-4].sh ?

    j'écrirais plutôt une fonction unique, qui accepte des paramètres, appelées dans une boucle pour traiter chaque site...
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    Par défaut
    Pas grand chose ne différencie les différents "sous-scripts".
    Pour info, en voilà un. J'ai mis en gras les particularités
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # ========================================================================================
    # Récupération de site_1.fr
    # ========================================================================================
    site=site_1.fr
    DATE_SITE=`date +%Y%m%d_%H%M%S`
    echo "========================================================="
    echo "Récupération de $site"
    echo "========================================================="
    echo "Récupération de $site commencée à $DATE_SITE" > $fichierlog
    mkdir $destracine/$DATE
    dest=$destracine/$DATE/$site
    echo $dest
    mkdir $dest
    lftp ftp://identifiant:motdepasse@serveur_ftp -e "mirror -e /www/ $dest/ ; quit"

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    ça confirme ce que je pensais.

    mets toutes les données de chaque site dans un seul ficher CSV (cf. Comment lire un fichier en shell).
    parcours ce fichier pour récupérer les informations de chaque site; le traitement se fera par une fonction unique dans le seul script principal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    maFonctionAmoi() {
       echo "premier argument : $1"
       echo "deuxième argument : $2"
       echo "troisième argument : $3"
    }
     
    maFonctionAmoi un "deux trois" quatre cinq
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    Par défaut
    Merci pour le tuyau !
    J'ai effectivement fait une fonction et je passe les info en paramètres.

    Pour faire simple, je n'ai pas fait de "CSV" mais directement dans le script.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Aenean Voir le message
    Pour en faciliter la lisibilité ainsi que la modularité, je voudrais le scinder en un programme principal et en autant de sous-programmes que de sites.
    Bonjour

    L'utilité d'un sous-script est de pouvoir être aussi appelé de façon externe par un utilisateur si celui-ci a besoin d'effectuer juste le travail du sous-script. En revanche, si ton sous-script est juste dédié à être exécuté depuis celui-là, il devient alors inutile de le mettre en tant que "script externe". Il vaut mieux le mettre en tant que "fonction". Au résultat il n'y a aucune différence (ni dans la façon de l'appeler) mais ça évite de démultiplier inutilement les petits scripts.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!bin/bash
    toto()    # Définition de ma fonction
    {
        ...
        ...
        ...
    }
     
    toto      # Appel de ma fonction


    Citation Envoyé par Aenean Voir le message
    La première partie étant commune, je voudrais passer les variables 'DATE, destracines, fichierlog' aux sous-progammes mais manifestement, ça ne fonctionne pas aussi facilement que je ne le pensais...
    Auriez-vous une solution ?
    Suffit de passer tes variables (ou même des valeurs) en tant qu'argument. Ceux-ci seront reçus dans le sous-script (ou dans la fonction) dans les paramètres positionnels $1, $2, $3,.... C'est expliqué dans tous les tutos de shell. Ce n'est pas parce qu'il y a des forums qu'il faut se dispenser de commencer par étudier par soi-même...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    $home/scripts/recup_site_4.sh valeur1 valeur2 $(pwd) $HOME $LOGNAME

    Exemple de code de "recup_site_4.sh"
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    echo "Le premier paramètre reçu est $1"
    echo "Le second paramètre reçu est $2"
    echo "Je me trouve dans $3"
    echo "Mon home directory est $4 (suis-je bête, je l'avais déjà dans $HOME !!!)"
    echo "Je suis l'utilisateur $5 (ou $LOGNAME)"
    echo "J'ai reçu $# paramètres qui sont (en vrac) $*"
    ...

    Et la même chose avec une fonction

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    recup_4_site()
    {
        echo "Le premier paramètre reçu est $1"
        echo "Le second paramètre reçu est $2"
        echo "Je me trouve dans $3"
        echo "Mon home directory est $4 (suis-je bête, je l'avais déjà dans $HOME !!!)"
        echo "Je suis l'utilisateur $5 (ou $LOGNAME)"
        echo "J'ai reçu $# paramètres qui sont (en vrac) $*"
    }
     
    recup_4_site  valeur1 valeur2 $(pwd) $HOME $LOGNAME

    PS: $HOME et $LOGNAME sont des variables prédéfinies. Ca t'évitera de recréer les tiennes contenant la même chose...
    PS2: tu as (ou t'as le droit de créer) un dossier nommé "bin" dans ton $HOME dédié à recevoir tes scripts persos. C'est plus conventionnel que "scripts" (même si ce n'est pas interdit) et ton environnement est (sauf cas particulier) déjà prévu pour taper dedans (variable "$PATH") quand tu appelles un programme
    PS3: c'est très rarement utile de faire du "cd" dans un script.
    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]

  7. #7
    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 Aenean Voir le message
    Pour info, en voilà un.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # ========================================================================================
    # Récupération de site_1.fr
    # ========================================================================================
    [snip]
    lftp ftp://identifiant:motdepasse@serveur_ftp -e "mirror -e /www/ $dest/ ; quit"
    Hors-sujet, mais attention!

    Pour des raisons de sécurité, il n'est pas recommandé de mettre des mots de passe en clair dans un script.

    Il vaut mieux utiliser un mécanisme de clés publiques/privées.

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

Discussions similaires

  1. Faire appel à un programme dans un script
    Par xxShawShankxx dans le forum Unix
    Réponses: 5
    Dernier message: 19/08/2011, 16h17
  2. Faire appel à un sous programme se trouvant dans un autre fichie
    Par Roud9 dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 12/04/2011, 11h43
  3. appel programme dans un script cgi
    Par Jane Home dans le forum Web
    Réponses: 3
    Dernier message: 30/04/2010, 11h30
  4. Appel d'une sous routine dans autre script
    Par tnarol dans le forum Langage
    Réponses: 8
    Dernier message: 17/09/2009, 16h38
  5. Requête POST dans un script bash
    Par desperado dans le forum Linux
    Réponses: 4
    Dernier message: 11/12/2007, 22h38

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