Nouveau problème avec bash, besoin d'aide
Résolu/Fermé
gnugo
-
27 févr. 2012 à 19:23
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 28 févr. 2012 à 11:47
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 28 févr. 2012 à 11:47
A voir également:
- Nouveau problème avec bash, besoin d'aide
- Nouveau outlook - Guide
- Créer un nouveau compte gmail - Guide
- Minimal bash-like line editing is supported ✓ - Forum Linux / Unix
- Créer un nouveau compte facebook gratuit - Guide
- Nouveau mercurial avis ✓ - Forum Vos droits sur internet
4 réponses
mamiemando
Messages postés
33079
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
23 avril 2024
7 749
Modifié par mamiemando le 27/02/2012 à 20:19
Modifié par mamiemando le 27/02/2012 à 20:19
Une manière de faire :
... qui donne :
Il y a peut-être moyen d'éviter de passer par un fichier temporaire avec une boucle while bien choisie mais je n'ai pas spécialement cherché ;-)
Bonne chance
#!/bin/sh tmp=$(mktemp) (for x in "$@"; do echo $x; done) | sort | uniq -d > $tmp while read ligne do # $ligne contient un argument en plusieurs exemplaires echo $ligne done < $tmp rm -f $tmp
... qui donne :
(mando@aldur) (~) $ sh toto.sh "a a" b "a a" c b d a a b
Il y a peut-être moyen d'éviter de passer par un fichier temporaire avec une boucle while bien choisie mais je n'ai pas spécialement cherché ;-)
Bonne chance
Salut, je te remercie ça marche bien comme ça!
je fais donc un while read line sur mon "$doublons" au lieu d'un for et le problème est réglé.
En plus c'est plus clair comme ça car on ne sait pas trop comment $doublons est transformé pour le for.
Problème résolu.
Mais si vous savez me dire pourquoi ma première solution ne fonctionne pas, ça m'interesse:-)
En gros j'ai un
doublons qui vaut :
"a
a b
c d"
Quand je fais un for sur $doublons ( et pas "$doublons" )
en ligne de commande il traite bien a, puis "a b" puis "c d"
mais lancé depuis un script, il traite a a b c d
je fais donc un while read line sur mon "$doublons" au lieu d'un for et le problème est réglé.
En plus c'est plus clair comme ça car on ne sait pas trop comment $doublons est transformé pour le for.
Problème résolu.
Mais si vous savez me dire pourquoi ma première solution ne fonctionne pas, ça m'interesse:-)
En gros j'ai un
doublons qui vaut :
"a
a b
c d"
Quand je fais un for sur $doublons ( et pas "$doublons" )
en ligne de commande il traite bien a, puis "a b" puis "c d"
mais lancé depuis un script, il traite a a b c d
mamiemando
Messages postés
33079
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
23 avril 2024
7 749
28 févr. 2012 à 10:27
28 févr. 2012 à 10:27
Parce que quand tu écris "for d in doublons", il itère sur la chaîne "a a" ce qui extrait non pas l'élément "a a" mais successivement "a", "a". Rajouter des guillemets autour de $doublons ne t'aidera pas plus car si par exemple tes doublons sont "a a" et "b b" il déclenchera une itération sur "a a b b" (la concaténation des doublons).
C'est pour la même raison que je suis passée par un fichier intermédiaire dans le bout de code que je t'ai proposé.
Bonne chance
C'est pour la même raison que je suis passée par un fichier intermédiaire dans le bout de code que je t'ai proposé.
Bonne chance
dubcek
Messages postés
18718
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 mars 2024
5 615
28 févr. 2012 à 11:47
28 févr. 2012 à 11:47
hello
$ ./f1 "a a" b "a a" c b d c a a b c $ cat f1 #!/bin/bash printf "%s\n" "$@" | sort | uniq -d | while read ligne do # $ligne contient un argument en plusieurs exemplaires echo $ligne done