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

Linux Discussion :

[bash] Equivalent de la fonction explode en bash ?


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Par défaut [bash] Equivalent de la fonction explode en bash ?
    Bonjour à tous !

    Pour les besoins d'un script, je souhaiterais stocker le resultat d'une commande dans une varibale. Ma commade me retourne un chemin. J'aimerais pouvoir acceder à tous les repertoire de ce chemin.
    En plus clair : Soit le resultat de ma commande stocké dans $chemin.
    $chemin est par exemple egal à /etc/tinydns/root/zone
    J'aimerais decouper ma chaine en 4 variables differentes qui contiendrait etc, tinydns, root et zone.
    En php, j'utiliserais $result = explode ("/", $chemin) et ensuite $result[0], $result[1], $result[2] et $result[3]
    Mais en bash, je ne trouve pas d'equivalent a explode

    Merci d'avance

    PS : Au passage, en therorie, je vais me retrouver avec un tableau, comment faire pour connaitre la taille d'un tableau ?

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Yein-Yein Voir le message
    Bonjour à tous !

    Pour les besoins d'un script, je souhaiterais stocker le resultat d'une commande dans une varibale. Ma commade me retourne un chemin. J'aimerais pouvoir acceder à tous les repertoire de ce chemin.
    En plus clair : Soit le resultat de ma commande stocké dans $chemin.
    $chemin est par exemple egal à /etc/tinydns/root/zone
    J'aimerais decouper ma chaine en 4 variables differentes qui contiendrait etc, tinydns, root et zone.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    old="$IFS"
    IFS=/
    set "$chemin"
    IFS="$old"
     
    for i in $*
    do
        echo $i
    done
    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]

  3. #3
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    old="$IFS"
    IFS=/
    set "$chemin"
     
    for i in $*
    do
        echo $i
    done
     
    IFS="$old"
    Sinon ça marche pas

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Maxoo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    old="$IFS"
    IFS=/
    set "$chemin"
     
    for i in $*
    do
        echo $i
    done
     
    IFS="$old"
    Sinon ça marche pas
    Ah si, tel que je l'ai écrit (avec le IFS avant le for) ça marche. L'IFS agit sur le set qui va positionner chaque répertoire séparé par "/" dans les paramètres $1, $2, $3 etc. Et le for va les traiter un à un.
    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]

  5. #5
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ah si, tel que je l'ai écrit (avec le IFS avant le for) ça marche. L'IFS agit sur le set qui va positionner chaque répertoire séparé par "/" dans les paramètres $1, $2, $3 etc. Et le for va les traiter un à un.
    Je suis pas un pro du bash, mais j'ai exécuté ton code et ça ne marchait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    chemin=/etc/tinydns/root/zone
     
    old="$IFS"
    IFS=/
    set "$chemin"
    IFS="$old"
     
    for i in $*
    do
        echo $i
    done
    renvoie cela chez moi :
    /etc/tinydns/root/zone
    Alors que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    chemin=/etc/tinydns/root/zone
     
    old="$IFS"
    IFS=/
    set "$chemin"
     
    for i in $*
    do
        echo $i
    done
    IFS="$old"
    renvoie :
    etc
    tinydns
    root
    zone
    Je ne sais pas trop l'expliquer, comme je te dis, je ne suis pas un pro
    Du coup je pensais que tu t'étais trompé, mais si tu dis que non c'est bizarre.

  6. #6
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 2
    Par défaut
    j'ai fait l'essai et trouve comme maxoo.
    a+

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Maxoo Voir le message
    Je suis pas un pro du bash, mais j'ai exécuté ton code et ça ne marchait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    chemin=/etc/tinydns/root/zone
     
    old="$IFS"
    IFS=/
    set "$chemin"
    IFS="$old"
     
    for i in $*
    do
        echo $i
    done
    renvoie cela chez moi :


    Alors que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    chemin=/etc/tinydns/root/zone
     
    old="$IFS"
    IFS=/
    set "$chemin"
     
    for i in $*
    do
        echo $i
    done
    IFS="$old"
    renvoie :


    Je ne sais pas trop l'expliquer, comme je te dis, je ne suis pas un pro
    Du coup je pensais que tu t'étais trompé, mais si tu dis que non c'est bizarre.
    Citation Envoyé par cristobal78 Voir le message
    j'ai fait l'essai et trouve comme maxoo.
    a+
    Je suis de retour avec un peu de retard. Etant sûr de moi mais néanmoins étonné d'être contredit ... j'ai lancé mon petit Linux pour tester.

    En effet, ton script ainsi présenté fonctionne tel qu'il est décrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    chemin=/etc/tinydns/root/zone
     
    old="$IFS"
    IFS=/
    set "$chemin"
     
    for i in $*
    do
        echo $i
    done
    IFS="$old"
    Et le mien ne fonctionne pas comme je le voudrais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    chemin=/etc/tinydns/root/zone
     
    old="$IFS"
    IFS=/
    set "$chemin"
    IFS="$old"
     
    for i in $*
    do
        echo $i
    done
    Le problème c'est que je sais comment fonctionne le set et l'IFS et donc ça doit forcément venir de par là.
    Tout à coup, pris d'un réflexe, j'enlève les guillemets au set
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    chemin=/etc/tinydns/root/zone
     
    old="$IFS"
    IFS=/
    set $chemin
    IFS="$old"
     
    for i in $*
    do
        echo $i
    done
    Et là, ça fonctionne parfaitement

    Explications: l'IFS n'est pas utilisé que pour le set. En fait, partout où le shell a besoin de séparer des éléments, il les séparera selon le ou les caractères de l'IFS. Ainsi, quand le for a besoin de traiter des éléments, ils seront traités eux-aussi selon l'IFS. Et malheureusement le fait que les éléments soient affichés séparément n'est qu'un travail du for et non du set.
    A la limite, en écrivant dans ton script "for i in /etc/tinydns/root/zone" ça fonctionnera pareil.

    Toutefois, dans nos scripts initiaux, le fait de mettre des guillemets est un impératif pour indiquer de ne pas séparer les choses (ce qui a rendu mon premier script inefficace)

    Comment rendre ce fait visuellement constatable ? Tout simplement en affichant le nombre de paramètres "$#" juste avant le for. Avec ton script, cela donne "1" vu que dans le tien aussi il y a des guillemets au "set" et que le boulot n'a pas été fait.
    Et avec mon script rectifié, cela donne bien "5" montrant ainsi que le set a bien découpé son argument comme il faut. Et bien entendu, une fois que le set a tout découpé, il est inutile (voire dangereux) de laisser l'IFS dans cet état foireux d'où la remise immédiate dans son état d'origine.
    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]

Discussions similaires

  1. aide pour une fonction collision en bash
    Par dipper dans le forum Linux
    Réponses: 5
    Dernier message: 14/04/2011, 23h21
  2. Explode en bash dans un tableau
    Par Maillon dans le forum Linux
    Réponses: 6
    Dernier message: 18/11/2008, 08h18
  3. equivalent fonction explode (php)
    Par lololoic dans le forum Access
    Réponses: 6
    Dernier message: 21/08/2006, 18h34
  4. equivalent de la fonction EXPLODE de php
    Par gyouk dans le forum ASP
    Réponses: 1
    Dernier message: 28/11/2005, 10h49
  5. Equivalent de la fonction trim
    Par PCHINK dans le forum C
    Réponses: 6
    Dernier message: 21/03/2004, 18h02

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