Pages : 1
#1 Le 23/11/2008, à 13:07
- AnsuzPeorth
[bash] Comparer 2 variables texte
Bjr,
L'eternel problème des espaces dans les variables...
Je vais essayer d'être clair !
ACCUEIL=`autoglade gui.glade`
rep=`echo "$ACCUEIL" | grep True | cut -d '=' -f1` #guillemets autour d'ACCUEIL pour garder les sauts de lignes.
corr=`cat code.txt | grep ^$n | cut -d "_" -f11`
if [ "$rep" != "$corr" ]; then
echo "une faute"
fi
Si les variables 'rep' et 'corr' n'ont qu'un seul element ca fonctionne, si plusieurs,ca ne fonctionne pas.
echo $ACCUEIL
reponse1='True' reponse2='True' reponse"='False'
echo $rep
reponse1 reponse2
echo $corr
reponse1 reponse2
La sortie autoglade
reponse1='True'
reponse2='True'
reponse3='False'
Je pense donc que ca vient des sauts de lignes qui sont changer lorsqu'elles sont dans une variable.
J'ai bien essayé avec sed de remplacer le saut ou l'espace mais rien n'y fait... L'espace dans 'rep' n'est pas reconnu en tant que tel ! (j'ai essayé \n \t meme \r ....)
Par contre si je passe par un fichier temporaire (echo $rep > FichierTemp) ca fonctionne....
J'ai essayé tout ce que je savais (en tout cas ce que je me souvenais), et comme d'habitude, le réponse sera hyper simple et je passerai pour un ignare.... (pourtant je me suis déjà bien battu avec ces foutus variable sous bash !)
Merci d'avance
#2 Le 23/11/2008, à 13:15
- draco31.fr
Re : [bash] Comparer 2 variables texte
Je pense que l'on va avoir du mal à t'aider ...
ACCUEIL=`autoglade gui.glade`
rep=`echo "$ACCUEIL" | grep True | cut -d '=' -f1` #guillemets autour d'ACCUEIL pour garder les sauts de lignes.
corr=`cat code.txt | grep ^$n | cut -d "_" -f11`
if [ "$rep" != "$corr" ]; then
echo "une faute"
fi
On ne sait pas ce qu'il y a dans le fichier gui.glade, ni dans le fichier code.txt
EDIT : j'avais commencé à lire ce topic : http://forum.ubuntu-fr.org/viewtopic.ph … 2#p2229892 qui est en doublon, c'est meiux expliqué ici !
à priori tu veux comparer deux donnée, tu peux faire un :
diff <(echo $rep) <(echo $corr)
je pense que le code retour est 0 si aucune différence et 1 si il y en a.
PS : le contenu du fichier code.txt serait quand même un plus !!
Dernière modification par draco31.fr (Le 23/11/2008, à 13:21)
Hors ligne
#3 Le 23/11/2008, à 13:16
- ®om
Re : [bash] Comparer 2 variables texte
Je n'ai pas bien compris (je ne sais pas ce qu'est autoglade), mais :
a='x x x'
b='x x x'
[ "$a" = "$b" ] && echo égalité
Ça affiche bien "égalité"...
Hors ligne
#4 Le 23/11/2008, à 13:27
- AnsuzPeorth
Re : [bash] Comparer 2 variables texte
Autoglade est l'équivalent de zenity (en beaucoup plus puissant)
Le fichier code.txt est plein de données d'où j'extrais ce qui m'interesse
Les retours des differents echo vous donne ce que contient les variables
En fin de compte, autoglade mets des sauts de ligne dans ses sorties, et lorsque ca passe par une variable, les sauts de ligne disparessent et sont remplacé par ???? (essayé avec sed de savoir ce que c'était)
En passant par un fichier temporaire ca fonctionne très bien !
ps:désolé pour le doublon, mais y'a eu un bug, involontaire !
#5 Le 23/11/2008, à 13:35
- AnsuzPeorth
Re : [bash] Comparer 2 variables texte
re
Bon avec
diff <(echo $rep) <(echo $corr)
ca fonctionne bien !
Mais alors, pourquoi avec une comparaison 'if' ca ne le fait pas ?
si quelq'un à une réponse, que je me couche moins bête ce soir qu'hier soir !
En tout cas merci !
#6 Le 23/11/2008, à 13:48
- AnsuzPeorth
Re : [bash] Comparer 2 variables texte
J'ajouterais meme qu'en utilisant 'diff' pour une comparaison, c'est beaucoup plus propre ! Je connaissais pas 'diff' comme ça !
Je l'utiliserais sans compter maintenant
#7 Le 23/11/2008, à 14:20
- draco31.fr
Re : [bash] Comparer 2 variables texte
il y a deux chose en une dans mon exemple ...
diff fic1 fic2
te donne les différence entre fic1 et fic2
L'utilisation de <(ta_commande) permet de prendre le contenu de ta_commande en entrée du process.
C'est comme un tube en inversé.
Là où c'est intéressant, c'est quand un process (diff en l'occurence) prend plusieurs entrée.
Il n'est pas possible de rediriger deux tubes vers un même processus, mais la syntaxe <(ta_commande) le permet.
Pour le if, je ne sais pas quoi te dire, mais tu aurais aussi pu tester en passant par un tableau :
ACCUEIL=(`autoglade gui.glade`)
rep=(`echo "$ACCUEIL[@]" | grep True | cut -d '=' -f1`) #guillemets autour d'ACCUEIL pour garder les sauts de lignes.
corr=(`cat code.txt | grep ^$n | cut -d "_" -f11`)
if [ "$rep[@]" != "$corr[@]" ]; then
echo "une faute"
fi
là tu devrais passer par des tableaux (array), et la comparaison de deux tableaux pourrait marcher ... mais pas sur.
Par ailleurs, il y a peut-être une différence entre les "espaces" dans le contenu de $rep et ceux dans le contenu de $corr : une modification de l'IFS pourrait changer le compartement du if... donc attention.
PS : pense à passer le topic en [RESOLU] si c'est OK pour toi.
Dernière modification par draco31.fr (Le 23/11/2008, à 14:24)
Hors ligne
#8 Le 23/11/2008, à 16:07
- AnsuzPeorth
Re : [bash] Comparer 2 variables texte
Par ailleurs, il y a peut-être une différence entre les "espaces" dans le contenu de $rep et ceux dans le contenu de $corr : une modification de l'IFS pourrait changer le compartement du if... donc attention.
PS : pense à passer le topic en [RESOLU] si c'est OK pour toi.
Le problème vient bien des espaces, mais comment resoudre cela ???
J'ai déjà essayé en modifiant l'IFS mais ca n'avait pas l'effet voulu...
Par contre, je ne peux pas passer le sujet en résolu car je ne suis pas connecté sous mon pseudo (je ne suis pas chez moi).
Merci pour le complement d'information !
(comment vous faites pour connaitre tout ça ??? j'ai parcouru toutes les docs online sans réponse. Je connais presque par coeur les pages d'ABStraduc, mais ces suptilitées du bash, où les trouver ?Y'a des putins de tronche sur ce forum.....)