Nouveau problème avec bash, besoin d'aide
Résolu/Fermé
gnugo
-
27 févr. 2012 à 19:23
dubcek Messages postés 18764 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 9 février 2025 - 28 févr. 2012 à 11:47
dubcek Messages postés 18764 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 9 février 2025 - 28 févr. 2012 à 11:47
A voir également:
- Nouveau problème avec bash, besoin d'aide
- Nouveau site coco chat - Accueil - Réseaux sociaux
- Comment créer un nouveau groupe sur whatsapp - Guide
- Créer un nouveau compte gmail - Guide
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Créer un nouveau compte google - Guide
4 réponses
mamiemando
Messages postés
33536
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 février 2025
7 828
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
33536
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 février 2025
7 828
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
18764
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
9 février 2025
5 624
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