Donc il faut que tu mettes done <<< "$donnee" dans ton code en #13.
Version imprimable
Donc il faut que tu mettes done <<< "$donnee" dans ton code en #13.
Perso, je n'approuve pas du tout cette pratique, car c'est un pur bashisme déjà, et surtout pour une raison de sécurité: le fichier, ici ne fait que quelques lignes, mais essayez avec un fichier de 10 millions de lignes. Je pense que vous avez le temps d'aller discuter à la machine à café avant qu'il n'affiche la première ligne, et seulement si l'admin ne vous poursuit pas dans les couloirs avant :mrgreen:
Toujours le même problème ça ne calcul que la première ligne.
C'est une bonne occasion d'aller prendre un café alors :lol:Citation:
Je pense que vous avez le temps d'aller discuter à la machine à café avant qu'il n'affiche la première ligne, et seulement si l'admin ne vous poursuit pas dans les couloirs avant
tu as essayé ma dernière proposition pour lire le fichier ?
Ah ben je sais pas alors, mais de toutes façons il vaudrait mieux que tu utilises une substitution de processus :
Code:
1
2
3
4 while read line # La boucle while va permettre de lire le fichier ligne par ligne do ./affichersigne $line done < <(cut -d ":" -f1,2,3 $1 | sed 's/:/ /g')
Non, sérieusement, une façon plus propre mais toujours du bashisme:
Pas testé, mais attention, il faut absolument un espace entre les 2 chevrons, donc < <( et pas <<(.Code:
1
2
3
4
5
6
7
8
9
10 #Programme principal if [ $# -ne 1 ]; then aide elif [ $# -eq 1 ]; then while read line # La boucle while va permettre de lire le fichier ligne par ligne do ./affichersigne $line done < <(cut -d ":" -f1,2,3 $1 | sed 's/:/ /g')
PS: je suppose que le code que tu as fourni n'est pas complet, car je ne vois pas la fin du if.
ces commandes sont inutiles : read peut lire ces données en assignant plusieurs variables, par exemple* :ou un tableau :Code:line='Galle:Martin:12-2-1989:rue du casino:Uriage-les-Bains:38000'; echo "$line" | { IFS=':-' read prenom nom jour mois reste; printf '%s\n' "$prenom" "$nom" "$jour" "$mois";}
--Code:echo "$line" | { IFS=':-' read -a tableau; printf '%s\n' "${tableau[@]::4}";}
* ici, pour la démonstration je fais un echo, et read ; printf dans une liste de commande.
Comment lances-tu ton script sur la machine en question ?
Que donne la commande:
Et est-ce que tu as vérifié que le script affichesigne est bien le même que celui que tu utilise sur ta propre machine ?Code:file fichier.csv
Simples affectations ? Non ? (Après, facile d'ajouter, ou non, un zéro, un appel de fonction, etc )Code:
1
2
3
4
5
6
7 $ while IFS=':' read a b c d;do j=${c%%-*};m=${c#*-};m=${m%-*};echo $m $j;done <personnes.txt 2 12 9 14 3 13 11 19 12 22 10 24
Citation:
Code:IFS=':-' read
Code:
1
2
3
4
5
6
7
8
9
10 $ line='Galle:Martin:12-2-1989:rue du casino:Uriage-les-Bains:38000'; echo "$line" | { IFS=':-' read prenom nom jour mois reste; printf '%s\n' "$prenom" "$nom" "$jour" "$mois";} Galle Martin 12 2 $ line='Galle:Jean-Claude:12-2-1989:rue du casino:Uriage-les-Bains:38000'; echo "$line" | { IFS=':-' read prenom nom jour mois reste; printf '%s\n' "$prenom" "$nom" "$jour" "$mois";} Galle Jean Claude 12
aïe ! j'avais anticipé Jean-Marc, mais pas Jean-Claude. :)
donc, en fait, il vaut mieux effectuer un Remplacement de paramètre (IFS='-' read -a jmY <<<"$date") postérieurement.
oui, mais si le .txt contient par exemple :
Lucien:Martin:12-13-1989:rue du casino:Paris:75016
Si les entrées, pour ton script, comme pour tous les logiciels du monde, ne respectent pas le format idoine, alors on peut mettre tous ces programmes à la poubelle.Citation:
oui, mais si le .txt contient par exemple :
Pourquoi vérifierais-tu que le mois ne dépasse pas 13 plus que le format de date, ou la présence d'un "\0" en plein milieu de ligne, ou que le fichier existe ?
C'est pas faux effectivement.
Pour le fun:
Code:
1
2
3
4
5
6
7 $ cat personnes.txt Galle:Martin:12-2-1989:rue du casino:Uriage-les-Bains:38000 Goudy:Debby:14-9-1990:avenue des cheveux raides:Paris:75002 Pleur:Jean:13-3-1994:rue de la poisse:Grenoble:38000 Prane:Dolly:19-11-1995: place de la pharmacie:Grenoble:38100 Mieu:Jeff-Edmond:22-12-1992:sentier des efforts:Grenoble:38000 Honnete:Marie:24-10-1982:boulevard Guignol:Paris:75003
Code:
1
2
3
4
5
6
7
8
9
10
11
12 $ cat signe.bash #!/bin/bash Jmax="20:19:20:20:21:21:22:23:23:23:22:21" Signe1="Capricorne:Verseau:Poissons:Belier:Taureau:Gemeaux:Cancer:Lion:Vierge:Balance:Scorpion:Sagittaire:Capricorne" while IFS=":" read a b c d do IFS="-" read j m y <<<$c i=$(cut -d\: -f $m <<<$Jmax) n=0 [[ $i -le $j ]] && n=1 echo $a $b $c $(cut -d\: -f $((m+n)) <<<$Signe1) done <personnes.txt
PS: Ici, je n'utilise pas de tableau volontairement suite indication donné dans le post initial.Code:
1
2
3
4
5
6
7 $ ./signe.bash Galle Martin 12-2-1989 Verseau Goudy Debby 14-9-1990 Vierge Pleur Jean 13-3-1994 Poissons Prane Dolly 19-11-1995 Scorpion Mieu Jeff-Edmond 22-12-1992 Capricorne Honnete Marie 24-10-1982 Scorpion
C'est pas de moi, mais du PO et ces "gens" habite dans une rue en rapport avec leur identité :ptdr: