Bonjour,
Dans un script je parse un fichier texte a plat et affiche sont contenu à l'écran.
Le problème c'est que tous s'affiche sur une colonne. J'aimerai savoir comment faire afficher sur plusieurs colonnes. Est ce possible?
Merci.
Bonjour,
Dans un script je parse un fichier texte a plat et affiche sont contenu à l'écran.
Le problème c'est que tous s'affiche sur une colonne. J'aimerai savoir comment faire afficher sur plusieurs colonnes. Est ce possible?
Merci.
Envoyé par Blo0d4x3
Un extrait du fichier en entrée et de la sortie souhaitée serait un plus
ok, voici une partie du fichier en question:
Sur la console le script va m'afficher ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 script1 script2 script3 ... script25
Moi ce que je voudrais c'est qu'il m'affiche:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 script1 script2 script3 script4 ... script25
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 script1 script5 script9 script2 script6 ... script3 script7 script4 script8
Envoyé par Blo0d4x3
Un script bash qui fait ce que tu veux
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
33 declare -a TabLine typeset -i NbrRec=0 typeset -i SizeCol typeset Col1=0 typeset Col2 typeset Col3 # ### Mise en table des enreg. du fichier toto.txt ### Nota : l'indice commence à zéro. # while read line ; do TabLine[$NbrRec]=$line ((NbrRec=$NbrRec+1)) done < toto.txt ((SizeCol=$NbrRec/3)) ((modulo=$NbrRec%3)) [[ $modulo -ne 0 ]] && ((SizeCol=$SizeCol+1)) ((Col2=$SizeCol)) ((Col3=$SizeCol*2)) # ### Affichage sous forme de 3 colonnes # while [[ $IndLine -lt $SizeCol ]] ; do printf %-15s\\t%-15s\\t%-15s\\n ${TabLine[$Col1]} ${TabLine[$Col2]} ${TabLine[$Col3]} ((IndLine=$IndLine+1)) ((Col1=$Col1+1)) ((Col2=$Col2+1)) ((Col3=$Col3+1)) done
Merci :-).
J'ai adapter un peu et ca ne marche pas et j'aurai quelque questions
Dans le premier printf "$NB_RECORD" dans le while, la variable s'incrémente bien. Mais une fois sortie du while, la variable $NB_RECORD vaut 0 !
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 function list() { typeset -i NB_RECORD=0 typeset -i SIZECOL declare -a TabLine typeset Col1=0 typeset Col2 typeset Col3 printf "$BLUE Liste des scripts disponibles: $NORMAL\n\n" cat $FICH_REF | egrep "^[^#][^#]*" | while read script over do TabLine[$NB_RECORD]=$script ((NB_RECORD=$NB_RECORD+1)) printf "record: $NB_RECORD\n" done printf "record: $NB_RECORD\n" ...
Et forcement le déroulement du script s'effectue mal a cause de ca.
Envoyé par Blo0d4x3
Faire "typeset -i NB_RECORD=0" dans une fonction déclare la variable NB_RECORD locale à la fonction.
Solution :
Nota : ce serait sympa de ta part de mettre en ligne ton script d'affichage amélioré
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 .../... typeset -i NB_RECORD=0 function list() { .../... NB_RECORD=0 ((NB_RECORD=$NB_RECORD+1)) .../... printf "record: $NB_RECORD\n" .../... } printf "record: $NB_RECORD\n"
J'ai fais comme tu m'a dis mais ca ne change rien:
Ca me fait en sortie:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 #!/bin/sh SCRIPTNAME=`basename $0` EXIT_SUCCESS=`exit 0` EXIT_ERROR=`exit -1` VERSION=1.0.0 FICH_REF="$BIBLIO/scripts" typeset -i NB_RECORD=0 function list() { typeset -i SIZECOL declare -a TabLine typeset Col1=0 typeset Col2 typeset Col3 NB_RECORD=0 printf "$BLUE Liste des scripts disponibles: $NORMAL\n\n" cat $FICH_REF | egrep "^[^#][^#]*" | while read script over do TabLine[$NB_RECORD]=$script ((NB_RECORD=$NB_RECORD+1)) printf "while record: $NB_RECORD\n" done printf "record: $NB_RECORD\n" ((SIZECOL=$NB_RECORD/3)) ((modulo=$NB_RECORD%3)) [[ $modulo -ne 0 ]] && ((SIZECOL=$SIZECOL+1)) ((Col2=$SIZECOL)) ((Col3=$SIZECOL*2)) printf "la\n" while [[ $IndLine -lt $SIZECOL ]] do printf %-15s\\t%-15s\\t%-15s\\n${TabLine[$Col1]} ${TabLine[$Col2]} ${TabLine[$Col3]} printf "${TabLine[$Col1]} ${TabLine[$Col2]} ${TabLine[$Col3]}" ((IndLine=$IndLine+1)) ((Col1=$Col1+1)) ((Col2=$Col2+1)) ((Col3=$Col3+1)) done printf "\n" } .../...
Je ne comprend pas du tous pouquoi elle revient a 0 sortie du while .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 ../.. while record: 36 while record: 37 while record: 38 while record: 39 while record: 40 while record: 41 while record: 42 while record: 43 while record: 44 record: 0
Pourquoi déclarer NB_RECORD en globale? Je ne m'en sert que dans cette fonction?
Envoyé par Blo0d4x3
Effectivement, l'histoire de la variable locale, ce n'était pas ça
Tout ce que je peux dire, c'est que le code ci-dessous marche :
egrep "^[^#][^#]*" $FICH_REF > $$tmp
while read script do
TabLine[$NB_RECORD]=$script
((NB_RECORD=$NB_RECORD+1))
printf "while record: $NB_RECORD\n"
done < $$tmp
rm $$tmp
en effet ca marche maintenant. Mais je comprend pas pourquoi avec ma méthode ca ne marchait pas , je vois pas la difference, si quelqu'un peu m"expliquer
J'ameliore un peu et je poste le tous.
Merci de ton aide :-)
Hello voici le script complet:
Si quelqu'un a des idées d'améliorations elles sont les bienvenues.
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161 #!/bin/sh SCRIPTNAME=`basename $0` EXIT_SUCCESS=`exit 0` EXIT_ERROR=`exit -1` VERSION=1.0.0 FICH_REF="$BIBLIO/scripts" #set -x source $BIBLIO/colors.sh source $BIBLIO/fonctions.sh function list() { typeset -i NB_RECORD=0 typeset -i SIZECOL declare -a TabLine typeset Col1=0 typeset Col2 typeset Col3 NB_RECORD=0 printf "$BLUE Liste des scripts disponibles: $NORMAL\n\n" egrep "^[^#][^#]*" $FICH_REF > $$tmp while read script over do TabLine[$NB_RECORD]=$script ((NB_RECORD=$NB_RECORD+1)) #printf "while record: $NB_RECORD\n" done < $$tmp rm $$tmp #cat $FICH_REF | egrep "^[^#][^#]*" | while read script over #do # TabLine[$NB_RECORD]=$script # ((NB_RECORD=$NB_RECORD+1)) # printf "while record: $NB_RECORD\n" #done #printf "record: $NB_RECORD\n\n\n" ((SIZECOL=$NB_RECORD/3)) ((modulo=$NB_RECORD%3)) [[ $modulo -ne 0 ]] && ((SIZECOL=$SIZECOL+1)) ((Col2=$SIZECOL)) ((Col3=$SIZECOL*2)) while [[ $IndLine -lt $SIZECOL ]] do printf %-20s\\t%-20s\\t%-20s\\n `basename ${TabLine[$Col1]}` `basename ${TabLine[$Col2]}` `basename ${TabLine[$Col3]}` ((IndLine=$IndLine+1)) ((Col1=$Col1+1)) ((Col2=$Col2+1)) ((Col3=$Col3+1)) done printf "\n" } function help_me() { printf "$SCRIPTNAME:$VERSION Aide: -h pour l'aide, -u pour l'utilisation\n\n" } function usage() { printf "$SCRIPTNAME:$VERSION Usage: -a installe tous les scripts, -f \$NOMSCRIPT installe le script seul, -l list les scripts disponible.\n\n" } function inst_all() { cat $FICH_REF | egrep "^[^#][^#]*" | while read SCRIPT OWNER GROUP PERM DESPATH do printf "Installation du script `basename $SCRIPT`\n" cp $SCRIPT $DESPATH >> /dev/null chown $OWNER:$GROUP $DESPATH/`basename $SCRIPT` >> /dev/null chmod $PERM $DESPATH/`basename $SCRIPT` >> /dev/null done if [ $? -ne 0 ] then printf "Installation [$RED KO $NORMAL]\n" else printf "Installation [$GREEN OK $NORMAL]\n" fi } function inst_script() { grep /$1 $FICH_REF | while read SCRIPT OWNER GROUP PERM DESPATH do printf "Installation du script `basename $SCRIPT`\n" cp $SCRIPT $DESPATH >> /dev/null chown $OWNER:$GROUP $DESPATH/`basename $SCRIPT` >> /dev/null chmod $PERM $DESPATH/`basename $SCRIPT` >> /dev/null done if [ $? -ne 0 ] then printf "Installation [$RED KO $NORMAL]\n" else printf "Installation [$GREEN OK $NORMAL]\n" fi } clear printf "$UNDERLINE\t\t\tScript d'installation des scripts perso$NORMAL\n\n" test_ID_root_and_exit getopts hualf: options case $options in a) inst_all ;; l) list ;; f) inst_script $2 ;; h) help_me ;; u) usage ;; *) help_me ;; esac
Quand tu écris
Tu "fork" (du verbe forker ;-)) un fils qui exécutera la commande while,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 cat fichier | while read line do ... done
au retour les variables modifiées dans le corps du while
le sont en faite dans le fils, donc plus rien à la mort de ce dernier.
Par contre :
fonctionne car dans ce cas tu ne "fork" (tiens encore le verbe forker) pas de fils, tu es toujours dans le même process pére.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 while read line do [...] done < fichier
Ah ok, je pensais à une histoire de descripteurs moi .
Merci de ces précisions ericduval :-).
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager