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 :

Utilisation d'une variable résultant d'une concaténation d'une chaine et d'une variable


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut Utilisation d'une variable résultant d'une concaténation d'une chaine et d'une variable
    Bonjour,

    Comme écrit dans le titre je voudrais utiliser le résultat d'une variable créé à partir de la concaténation d'une chaine de caractère et d'une variable.

    Voici le cas d'utilisation que j'aimerai réaliser

    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
    # Paramétrage
    fich1="753256/olkiuj"
    fich2="159852/tgfred"
    fich3="478526/kijuyh"
    fich4="852469/olkuiy"
    fich5="258746/hfgjlo"
     
    # Action
    for id in `seq 1 5`;
    do 
    	cmd ./dossier/${fich$id}.ext	# va chercher la commande fich#  et non la variable
    	cmd ./dossier/$fich$id.ext	# va chercher la variable fich qui n'existe pas donc faux
    	cmd ./dossier/$(fich$id).ext	# peut-être 
    	cmd ./dossier/$"fich$id".ext	# peut-être 
    done
    Note : le .ext c'est pour l’extension du fichier
    Quelle commande va pouvoir fonctionner sur les fichiers placés en paramètre ?
    C'est peut être une méthode barbare mais j'aimerai vraiment que ça soit aussi simple que ça.

    J'ai vu le post : http://www.developpez.net/forums/d13...dont-nom-varie
    où le même cas de figure arrive, mais j'aimerai pouvoir ne pas utiliser de tableau.

    Merci pour votre aide !

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut
    as tu essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd ./dossier/${fich}${id}.ext
    ?

    Edit : j'ai lu de travers et repondu de meme
    +1 pour Al1

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd ./dossier/$(eval "echo \${fich${id}}").ext
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut
    Pour :
    Citation Envoyé par Jean.Cri1 Voir le message
    as tu essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd ./dossier/${fich}${id}.ext
    ?
    Dans ce que tu proposes, tu inclues une variable nommée fich
    Mais cette variable n’existe pas, donc la boucle va sortir les commandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cmd ./dossier/1.ext
    cmd ./dossier/2.ext
    cmd ./dossier/3.ext
    cmd ./dossier/4.ext
    cmd ./dossier/5.ext
    Arrêtez moi si je me trompe complétement, je suis vraiment novice.
    ----------------------------------------------------------

    Sinon pour la réponse de al1_24
    Citation Envoyé par al1_24 Voir le message
    et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd ./dossier/$(eval "echo \${fich${id}}").ext
    C'est surement ce qu'il faut, je test ça dés que j'aurai un environnement Linux à porté de main.

    Merci pour vos réponses rapides, je vous tiens au courant.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Citation Envoyé par Yanar
    j'aimerai pouvoir ne pas uiliser de tableau.
    et pourquoi s'il vous plaît ?

    c'est très bien les tableaux.
    c'est moderne les tableaux.
    tout le monde devrait utiliser des tableaux.

    patron ! des tableaux pour tous !
    et pour moi, un tableau associatif.

    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Et pour les allergiques de "eval", il y a la solution suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd ./dossier/`set|grep "^fich$id"|cut -d= -f2`.ext


    Cordialement.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut
    Deux solutions testés et fonctionnelles, les voici :

    Citation Envoyé par al1_24 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd ./dossier/$(eval "echo \${fich${id}}").ext
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd ./dossier/`set|grep "^fich$id"|cut -d= -f2`.ext
    Merci pour vos réponses, pour moi la question est résolue même si il reste la piste du tableau qui apparemment mériterait d’être développé.
    Charge à ceux qui le pourront, de la faire. ... ou pas

    A bientôt !

  8. #8
    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 disedorgue Voir le message
    Et pour les allergiques de "eval", il y a la solution suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd ./dossier/`set|grep "^fich$id"|cut -d= -f2`.ext
    [mega_chipotage]
    En espérant qu'il n'y a pas un fou qui a pondu une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto=$(echo 'suite_a_la_ligne\nfich3=meme_pas_une_vraie_variable')
    [/mega_chipotage]


    .
    Idem!

  9. #9
    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 Yanar Voir le message
    Merci pour vos réponses, pour moi la question est résolue même si il reste la piste du tableau qui apparemment mériterait d’être développé.
    Charge à ceux qui le pourront, de la faire. ... ou pas

    A bientôt !
    C'est pourtant la solution la plus simple!

    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
    # Paramétrage
    fich[1]="753256/olkiuj"
    fich[2]="159852/tgfred"
    fich[3]="478526/kijuyh"
    fich[4]="852469/olkuiy"
    fich[5]="258746/hfgjlo"
     
    # Action
    for id in `seq 1 5`;
    do 
    	#cmd ./dossier/${fich$id}.ext	# va chercher la commande fich#  et non la variable
    	#cmd ./dossier/$fich$id.ext	# va chercher la variable fich qui n'existe pas donc faux
    	#cmd ./dossier/$(fich$id).ext	# peut-être 
    	#cmd ./dossier/$"fich$id".ext	# peut-être 
    	cmd ./dossier/${fich[$id]}.ext	# sûrement
    done

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut
    mais c'est tout con, faut que je test ça absolument

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto=$(echo 'suite_a_la_ligne\nfich3=meme_pas_une_vraie_variable')
    Pas d'accord, les retours à la ligne ne sont pas interprété car historiquement c'était employé comme faille de sécurité qui bien souvent permettait de devenir monsieur racine (et je ne parle pas de l'écrivain )
    D'ailleurs tu peux essayer un
    si tu fait un set ou même un echo, tu verras le résultat sur la même ligne.

    Cordialement.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut
    Une solution Tableau testée et fonctionnelle :
    Et oui effectivement c'est la plus simple !
    Citation Envoyé par jack-ft Voir le message
    C'est pourtant la solution la plus simple!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # Paramétrage
    fich[1]="753256/olkiuj"
    fich[2]="159852/tgfred"
    fich[3]="478526/kijuyh"
    fich[4]="852469/olkuiy"
    fich[5]="258746/hfgjlo"
     
    # Action
    for id in `seq 1 5`;
    do 
    	cmd ./dossier/${fich[$id]}.ext	# à coup sur !
    done
    Pas besoin d'initialiser de tableau comme dans l'autre post ... ce qui m’embêtait . Ici le tableau se construit tout seul.


    Donc voila, je pense que l'on a fait le tour avec ces 3 solutions qui aurons toutes des avantages et des inconvenants.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    si ton shell peut utiliser des tableaux, la commande seq est superflue :
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    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 disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto=$(echo 'suite_a_la_ligne\nfich3=meme_pas_une_vraie_variable')
    Pas d'accord, les retours à la ligne ne sont pas interprété car historiquement c'était employé comme faille de sécurité qui bien souvent permettait de devenir monsieur racine (et je ne parle pas de l'écrivain )
    D'ailleurs tu peux essayer un
    si tu fait un set ou même un echo, tu verras le résultat sur la même ligne.

    Cordialement.
    Lorsque je suis comme la fosse du même nom, je ne crois que ce que je vois et j'essaie (je suis très docile!):

    Code shell : 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
    $ ls
    bibi/   bibi2.cpio   caller_2.txt*  caller.txt*  f2                   plop_130115  rep avec espace/  toto  tutu
    bibi2/  called.txt*  caller_3.txt*  f1           fichier avec espace  plop_130116  testK             totu  uxlst.out
    $ toto=$(ls) 
    $ set
    IFS=' 	
    '
    toto='bibi/
    bibi2/
    bibi2.cpio
    called.txt*
    caller_2.txt*
    caller_3.txt*
    caller.txt*
    f1
    f2
    fichier avec espace
    plop_130115
    plop_130116
    rep avec espace/
    testK
    toto
    totu
    tutu
    uxlst.out'

    Je constate aussi que echo "${toto}" produit la même chose (contrairement à echo ${toto} qui remplace les returns par des espaces).
    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
    $ echo "${toto}"
    bibi/
    bibi2/
    bibi2.cpio
    called.txt*
    caller_2.txt*
    caller_3.txt*
    caller.txt*
    f1
    f2
    fichier avec espace
    plop_130115
    plop_130116
    rep avec espace/
    testK
    toto
    totu
    tutu
    uxlst.out
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo ${toto}   
    bibi/ bibi2/ bibi2.cpio called.txt caller_2.txt caller_3.txt caller.txt f1 f2 fichier avec espace plop_130115 plop_130116 rep avec espace/ testK toto totu tutu uxlst.out
    Quant à la solution proposée, voici la faille:

    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ set -u
    $ toto=$(echo 'suite_a_la_ligne\nfich3=meme_pas_une_vraie_variable\n')
    $ id=3
    $ echo ./dossier/`set|grep "^fich$id"|cut -d= -f2`.ext
    ./dossier/meme_pas_une_vraie_variable.ext
    $ echo $fich3 
    ksh: fich3: parameter not set
    $ echo $KSH_VERSION
    @(#)PD KSH v5.2.14 99/07/13.2

    Donc, je persiste et signe mon méga-chipotage...

  15. #15
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    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
    $ for i in 753256 159852 478526 852469 258746 ; do find ./${i}/ -name "[otkh][lgif][kfjg][iruj][ueyil][jdhyo][1-5].ext" -exec ls -l {} \; ; done    
    -rw-r--r--  1 francois  francois  0 Mar 21 19:02 ./753256/olkiuj1.ext
    -rw-r--r--  1 francois  francois  0 Mar 21 19:02 ./753256/olkiuj5.ext
    -rw-r--r--  1 francois  francois  0 Mar 21 19:02 ./159852/tgfred2.ext
    -rw-r--r--  1 francois  francois  0 Mar 21 19:02 ./852469/olkuiy4.ext
    $ $ for i in 753256 159852 478526 852469 258746 ; do ls -l ${i} ; done                                                                        
    total 0
    -rw-r--r--  1 francois  francois  0 Mar 21 19:02 olkiuj1.ext
    -rw-r--r--  1 francois  francois  0 Mar 21 19:02 olkiuj5.ext
    total 0
    -rw-r--r--  1 francois  francois  0 Mar 21 19:02 tgfred2.ext
    total 0
    -rw-r--r--  1 francois  francois  0 Mar 21 19:02 kijuyh.ext
    total 0
    -rw-r--r--  1 francois  francois  0 Mar 21 19:02 olkuiy4.ext
    total 0
    -rw-r--r--  1 francois  francois  0 Mar 21 19:03 hfgjlo8.ext
    $
    suffit de changer la partie EXEC du find par la commande appropriée...et les noms des fichiers & répertoires par leurs variables

    ça me parait plus logique comme mode de recherche ...
    que de concatener des chaines dans une chaine pour l'interroger tout en bouclant sur une commande

    et le resultat est le même on trouve les fichiers selon le motif et on les traite

  16. #16
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Et oui tu peux chipoter, cela m'apprendra à ne pas tester en ksh, tout au moins pour le "set", comme c'est le forum linux, par défaut je me mets en bash (j'ai honte, moi qui refuse d'être sectaire ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ set -u
    $ toto=$(echo 'suite_a_la_ligne\nfich3=meme_pas_une_vraie_variable\n')
    $ id=3
    $ echo ./dossier/`set|grep "^fich$id"|cut -d= -f2`.ext
    ./dossier/.ext
    $ echo $fich3
    -bash: fich3: unbound variable
    $ echo $BASH_VERSION
    4.1.10(4)-release
    Pour le echo, on est d'accord avec l'encadrement des "".

    Sinon, une autre faille plus basic est situé dans le pattern du grep qui permet ici d'avoir des variables du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fich3blabla=pas_la_bonne_variable
    Je laisse la solution en suspend car très simple et peux être un petit exercice pour les débutants

    Cordialement.

Discussions similaires

  1. [JSTL] Interpréter une variable qui est la concaténation de 2 variables
    Par JimJames06 dans le forum Taglibs
    Réponses: 12
    Dernier message: 02/07/2014, 08h53
  2. Réponses: 2
    Dernier message: 01/12/2008, 09h59
  3. Réponses: 3
    Dernier message: 12/06/2006, 11h18
  4. Concaténation de deux integer pour former une clé primaire
    Par stoukou dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 08/09/2005, 10h34
  5. Concaténer des lignes d'enregistrements dans une colonne
    Par dany13 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 08/07/2005, 21h56

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