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 :

Problème avec read et IFS


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 7
    Par défaut Problème avec read et IFS
    Bonjour,

    Ayant récemment passé un examen sur ordinateur concernant l'utilisation des scripts shells sur Linux , je me retrouve devant un problème bien étrange.
    Je vous présente le code ainsi que son utilisation et un exemple de fichier allant avec.

    Nom du script: équipe_victoire

    Compatible avec: Bash

    Descriptif: permet de trouver le nombre de victoire d'une équipe en fonction d'une année et d'un nom d'équipe.

    Exemple d'exécution : ./equipe_victoire 2014 Lyon fichier_equipe

    Code
    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
     #! /bin/bash
    # tata.sh
     
    if [ $# -ne 3 ]
    then
    	echo "Parametre differents de 3"
    else
    	equipe=$2
    	saison=$1
    	for i in $(cat $3)
    	do
    		bak=$IFS
    		echo $i #placer pour tester la valeur de i avant le changement de l'IFS 
    		IFS=';'
    		echo $i #placer pour tester la valeur de i après le changement de l'IFS 
    		read a b c d <<< $i
    		if [ $a = "$equipe" ] && [ $c = "$saison" ]
    		then
    			echo "Nombre de victoire de $equipe à la saison $saison: $d"
    			break
    		fi
    		IFS=$bak
    	done
     
    fi
    Fichier : # Format équipe;ligue;annee;victoires
    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
     
    Lyon;1;2014;21
    Paris;1;2014;29
    Marseille;1;2014;16
    Monaco;1;2014;18
    Lyon;1;2010;20
    Paris;1;2010;32
    Marseille;1;2010;28
    Monaco;1;2010;28
    Ajjacio;2;2014;21
    Saint-Etienne;2;2014;29
    Real;2;2014;16
    Guimgang;2;2010;19
    Ajjacio;2;2010;22
    Saint-Etienne;2;2010;30
    Real;2;2010;20
    Guimgang;2;2010;10
    Alors, je sais que le code n'est pas dès plus beau et qu'on peut passer par des grep mais je n'y avais pas pensé. Cependant lorsque je l'ai testé lors de mon contrôle il se trouve qu'il m'affichait bien le bon résultat avec l'équipe voulu et le nombre de ses victoires. Mais le point étrange et qu'aujourd'hui quand je retest le code il ne marche plus du tout , après le changement de l'IFS $i n'est plus égale à "équipe;ligue;année;victoires" mais à "équipe ligue année victoires" ce qui change tout car l'IFS étant changé le read voit cette phrase comme une seule valeur.
    J'ai essayé de comprendre l'erreur mais en vain, pourriez vous m'éclairer sur le sujet?

    Merci d'avance,
    Bonne soirée !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 7
    Par défaut
    Bonjour,
    Merci de la réponse rapide.

    J'ai regardé le lien, et je pense avoir déjà compris tout cela. C'est juste le fait que la valeur de $i change qui me dérange.
    Je vous donne un exemple sur les deux échos présent un avant la commande IFS = ";" l'autre aprè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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Lyon;1;2014;21
    Lyon 1 2014 21
    Paris;1;2014;29
    Paris 1 2014 29
    Marseille;1;2014;16
    Marseille 1 2014 16
    Monaco;1;2014;18
    Monaco 1 2014 18
    Lyon;1;2010;20
    Lyon 1 2010 20
    Paris;1;2010;32
    Paris 1 2010 32
    Marseille;1;2010;28
    Marseille 1 2010 28
    Monaco;1;2010;28
    Monaco 1 2010 28
    Ajjacio;2;2014;21
    Ajjacio 2 2014 21
    Saint-Etienne;2;2014;29
    Saint-Etienne 2 2014 29
    Real;2;2014;16
    Real 2 2014 16
    Guimgang;2;2010;19
    Guimgang 2 2010 19
    Ajjacio;2;2010;22
    Ajjacio 2 2010 22
    Saint-Etienne;2;2010;30
    Saint-Etienne 2 2010 30
    Real;2;2010;20
    Real 2 2010 20
    Guimgang;2;2010;10
    Guimgang 2 2010 10
    Je ne comprend pas pourquoi les ";" sont devenus des espaces. Ducoup quand je fais read a b c d <<< $i j'obtiens $a = équipe ligue saison victoire , et $b $c $d qui ne contiennent rien car j'ai changé l'IFS juste avant.
    Cela me bloque vraiment car ça marchait quand je l'ai testé y'a deux semaines.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    les guillemets.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 7
    Par défaut
    Effectivement, ça à l'air d'être le problème. Mais pourquoi le guillemet autour du $i change sa valeur ? Echo en fonction de l'IFS ? C'est vraiment bizarre, encore une fois j'avais testé avant de rendre et ça me renvoyait bien les bonnes valeurs il y a un mois. Y'a t'il des versions qui acceptent le fait de ne pas avoir de guillemets ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    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 GemRire Voir le message
    C'est juste le fait que la valeur de $i change qui me dérange.
    ...
    Je ne comprend pas pourquoi les ";" sont devenus des espaces.
    Comme "expliqué" par N_BaH, ce n'est pas la valeur de $i qui change mais son affichage.
    Un bon dessin vaut mieux qu'un long discours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ i=a;b;c
    $ echo "$i" $i
    a;b;c a;b;c
    $ IFS=';'
    $ echo "$i" $i
    a;b;c a b c
    Les ';' dans l'affichage de "$i" (avec les guillemets) montrent bien que la valeur en tant que telle n'a pas changé.
    Mais le développement de $i sans les guillemets utilise le découpage en mots (comme indiqué dans le man cité) et transforme les ';' en espaces.

    Pour le read, c'est pareil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ read a b c <<< $i
    $ echo "'$a' '$b' '$c'"
    'a b c' '' ''
     
    $ read a b c <<< "$i"
    $ echo "'$a' '$b' '$c'"
    'a' 'b' 'c'
    C'est clair?
    PS: juste pour info, à ma connaissance, il n'existe pas de ville appelée "Guimgang"...
    ou alors c'est un nouveau gang (ou un gag!)
    Et que dire de "Ajjacio"?!?!

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 7
    Par défaut
    Bonsoir ! Je vois , je comprend c'est assez rageant d'avoir perdu des points sur cette erreur , merci de m'avoir éclairé !
    PS : Oui en effet c'est guingamp j'avais crée ce fichier en fonction de mes souvenirs

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    pour moi, rien que le fait de ne pas sortir quand le nombre de paramètres requis n'est pas correct t'aurait blackboulé.
    alors lire un fichier avec une boucle for...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Problème d'incompatibilité dans un script avec read, IFS et rsync
    Par Jipété dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 27/04/2015, 19h06
  2. Problème avec read.table()
    Par skystef dans le forum R
    Réponses: 7
    Dernier message: 19/02/2010, 09h56
  3. [Smarty] Problème de read ressource avec smarty
    Par willkayser dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/01/2008, 23h34
  4. [read] problème avec le buffer
    Par pitit777 dans le forum Réseau
    Réponses: 6
    Dernier message: 05/10/2006, 18h38
  5. Problème avec la fonction read.
    Par Whaouu dans le forum Langage
    Réponses: 10
    Dernier message: 23/09/2005, 10h33

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