Dialog et checklist de longueur variable

Résolu/Fermé
johan78125 - 11 mars 2009 à 22:20
linuxnico Messages postés 204 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 8 octobre 2010 - 13 mars 2009 à 07:57
Bonjour,

Un bon casse tête sur ce bout de code.
Je cherche à faire une fonction graphique avec dialog me permettant de choisir les groupes present dans /etc/group via un menu checklist.

dialog reclame un format du type:
--checklist "text" height width list-height "tag" "item" status

exp pour 3 lignes de menu:
--checklist "blabla" 10 10 10 \
"truc1" "machin1" off \
"truc2" "machin2" off \
"truc3" "machin3" off \

Hors dans mon cas, le nombre de lignes est variable...
J'ai donc pensé faire cela:

######## MON CODE ########
lignes=$(wc -l /etc/group | cut -d" " -f1)
champs=""
i=1

while [ $i -le $lignes ]
do
groupe[$i]=$(cat /etc/group | /usr/bin/awk '{print " "FNR ":"$0}' | grep " $i:" | cut -d: -f2)
gid[$i]=$(cat /etc/group | /usr/bin/awk '{print " "FNR ":"$0}' | grep " $i:" | cut -d: -f4)
utilisateur[$i]=$(cat /etc/group | /usr/bin/awk '{print " "FNR ":"$0}' | grep " $i:" | cut -d: -f5)

champs[$i]=$(echo -e \"$(echo ${groupe[$i]})\" \"$(echo ${gid[$i]}) - $(echo ${utilisateur[$i]})\" off)
let $[ i+=1 ]
done

$DIALOG --backtitle "$backtitle" \
--title "Suppression de groupes" \
--ok-label "Valider" \
--cancel-label "Retour" \
--checklist "Cochez les groupes que vous souhaitez supprimer.\n\n groupe gid - utilisateur(s)" 18 60 10 \
${champs[@]} 2> $fichierTemp
###### FIN MON CODE ##########

Mon tableau champs[ ] formate bien à la syntaxe demandé mais je me tape un joli:

Error: Expected at least 7 tokens for --checklist, have 4.
Use --help to list options.

Si quelqu'un à une idée, il gagnerait mon entière gratitude. ;-)
Merci

3 réponses

linuxnico Messages postés 204 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 8 octobre 2010 10
12 mars 2009 à 09:03
que donne

echo ${champs[@]}

ou plutot que contient reelement apres le dialog champs[]??
0
Bonjour,

ici echo ${champs[@]} me renvoie la totalité de la table champs[ ] formaté pour la commande dialog.

# echo ${champs[@]}
"root" "0 - " off "daemon" "1 - " off "bin" "2 - " off "sys" "3 - " off ...........

Mais après réflexion je suis parti sur une autre piste.
En effet ma boucle while est vraiment sous optimale... si j'ai 30 groupes, ça fait :
/etc/group lu 91 fois, et 540 forks !!!
Donc avec un peu de recherche j'ai abouti à ceci:

##### MON CODE ######
eval $(echo -en "$DIALOG --backtitle \"$backtitle\" \
--title \"Suppression de groupes\" \
--ok-label \"Valider\" \
--cancel-label \"Retour\" \
--checklist \"Cochez les groupes que vous souhaitez supprimer.\n\n groupe gid - utilisateur(s)\" 18 60 10 "
savIFS="$IFS"
IFS=":"
while read group x gid users ; do
echo -en "\"$group\" \"$gid - $users\" off "
done < $fichierEtcGroup
IFS="$savIFS") 2> $fichierTemp
##### FIN MON CODE ######

J'y trouve deux avantages:
- Je liste /etc/group et formate ma sortie en une seule passe (pas des moins intéressant)
- Ma commande dialog est formaté correctement et ne se plein plus ;-)

Merci de vous être intéressée à mon problème.
A bientôt je l'espère.
0
linuxnico Messages postés 204 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 8 octobre 2010 10
13 mars 2009 à 07:57
ah ben parfait!!!

t'est une bete!

ps: j'espere ne pas te voir "bientot" comme tu le dit, cela voudrait dire que tu a encore des soucis!! ;-)
0