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 :

Array en parametre fonction


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut Array en parametre fonction
    Bonjour à tous,

    J'ai créer une fonction, et j'aimerai qu'elle prenne en paramètre deux tableaux (ça a pour but de copier les fichiers dans SOURCE, vers les répertoires de CIBLE => cp $SOURCE /mon_repertoire/$CIBLE pour chaque ligne des tableaux).
    J'ai trouvé une manière de faire sur le net, mais le souci c'est que si une valeur dans le tableau est vide, il la supprime...
    Voilà mon script, merci pour votre aide :

    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
     
    #!/bin/bash
     
     
    export SOURCE=(
    	"fichier1"
    	"fichier2"
    	"fichier3"
    	"fichier4"
    )
     
    export CIBLE=(
    	"rep1"
    	""
    	"rep1/sousrep1"
    	""
    )
     
    function test
    {
    	array_1=($(eval echo $(echo \${$1[@]})))
    	array_2=($(eval echo $(echo \${$2[@]})))
    	for file_1 in ${array_1[*]}
    	do
    		echo "$file_1"
    	done
    	echo "----"
    	for file_2 in ${array_2[*]}
    	do
    		echo "$file_2"
    	done
    }
     
    test SOURCE CIBLE
    J'ai ça en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    bash-3.2$ ./s.sh
    fichier1
    fichier2
    fichier3
    fichier4
    ----
    rep1
    rep1/sousrep1
    bash-3.2$
    Et j'aimerais qu'il retrouve mes lignes vides dans le tableau "CIBLE" sinon ça me décale tout au niveau des répertoires..

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    Bonjour,

    pourquoi utiliser une fonction ? le code est répété à des endroits différents dans le script ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Salut,

    Oui, en fait, ce script est un script d'installation d'une nouvelle version de mon site.
    Du coup ce ne sont pas précisément des cp mais des scp qui sont utilisés.
    Mais à la base mon arbo contient une vingtaine de répertoires (includes, styles, adm, ucp, cache, tmp, ....) avec pleins de fichiers différents dedans.
    Du coup pour chaque répertoire, j'ai un tableau avec sa liste de fichiers, du coup la fonction me paraît utile

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    du coup la fonction me paraît utile
    ce n'est pas évident : scp peut copier plusieurs fichiers d'un coup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ scp serveur:"fichier1 fichier2" chemin/
    je me pencherais plutôt sur la substitution d'accolades
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ printf '%s\n' /chemin/{fichier_{1..3},fic_{1..3}}
    /chemin/fichier_1
    /chemin/fichier_2
    /chemin/fichier_3
    /chemin/fic_1
    /chemin/fic_2
    /chemin/fic_3
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Et bien en fait, le scp me permet de tester pour chaque fichier, le retour de la commande, savoir si la copie s'est bien passée avant de passer à l'autre.
    Si j'ai un souci à la fin, du coup j'affiche les fichiers qui sont en erreurs....
    Tu n'as pas d'idée sinon ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    avec des nameref :
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ array_1=( {a..d} )
    $ maFonc() { declare -n array_ref=$1; printf '%s\n' "${array_ref[@]}"; }
    $ maFonc array_1
    a
    b
    c
    d
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Avec ma fonction ça ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function test
    {
    	declare -n array_1=$1; printf '%s\n' "${array_1[@]}"
    	declare -n array_2=$2; printf '%s\n' "${array_2[@]}"
    	for file_1 in ${array_1[*]}
    	do
    		echo "$file_1"
    	done
    	echo "----"
    	for file_2 in ${array_2[*]}
    	do
    		echo "$file_2"
    	done
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bash-3.2$ ./s.sh
    ./s.sh: line 20: declare: -n: invalid option
    declare: usage: declare [-afFirtx] [-p] [name[=value] ...]
     
    ./s.sh: line 21: declare: -n: invalid option
    declare: usage: declare [-afFirtx] [-p] [name[=value] ...]
     
    ----

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    ah, ouais... j'avais pas vu : bash 3.2 !
    quelle distro utilise encore cette "antiquité" ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Mon serveur synology, mince comment faire du coup ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    Et j'aimerais qu'il retrouve mes lignes vides dans le tableau "CIBLE" sinon ça me décale tout au niveau des répertoires..
    il y a une différence entre $* et $@ :

    sans guillemets il n'y a pas de différence : le tableau est sorti en mot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ ar=( a b 'c d' e )
    $ printf '%s\n' ${ar[*]}
    a
    b
    c
    d
    e
    $ printf '%s\n' ${ar[@]}
    a
    b
    c
    d
    e
    avec des guillemets, avec * le tableau sort d'un seul tenant, avec @ le tableau sort en éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ printf '%s\n' "${ar[*]}"
    a b c d e
    $ printf '%s\n' "${ar[@]}"
    a
    b
    c d
    e
    on boucle, donc, toujours sur les éléments d'un tableau (c'est son utilité!).
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Je vois, mais du coup dans ma fonction ça donnerait quoi ?

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par lokomass Voir le message
    Je vois, mais du coup dans ma fonction ça donnerait quoi ?
    Ben, dans ta fonction de départ, tu peux essayer de remplacer for file_1 in ${array_1[*]} par for file_1 in "${array_1[@]}" et idem pour array_2, par exemple...

    PS: je ne suis pas sûr que les "eval" soient indispensables! (eval is evil)

    Pourquoi ne pas mettre directement for file_1 in "${1[@]}" ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    parce que ${1} n'est pas un tableau.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Bon finalement j'ai repris la solution de base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FICHIER_SOURCE=($(eval echo $(echo \${$1[@]})))
    J'ai modifié les valeurs vides de mon array :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    export CIBLE=(
    	"rep1"
    	"/"
    	"rep1/sousrep1"
    	"/"
    )
    Et dans ma fonction je fais comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if [ "${FICHIER_CIBLE[$A]}" != "/" ]
    		then
    			CIBLE="${FICHIER_CIBLE[$A]}"
    		else
    			CIBLE=""
    		fi

    C'est un peu bidouille mais ça fonctionne

Discussions similaires

  1. mise à jour d'array dans une fonction
    Par Kassar dans le forum Langage
    Réponses: 3
    Dernier message: 09/11/2008, 16h32
  2. tableau de structure en parametre fonction
    Par Dark_Alex69 dans le forum Débuter
    Réponses: 3
    Dernier message: 12/11/2007, 18h38
  3. parametres fonction fixée par le programmeur
    Par adurandet dans le forum C++
    Réponses: 5
    Dernier message: 05/11/2007, 23h00
  4. Problème parametre fonction DLL VC++
    Par lio33 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 29/06/2007, 14h01
  5. Parametre Fonction falcultatif
    Par hugo69 dans le forum VBA Access
    Réponses: 4
    Dernier message: 31/05/2007, 16h15

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