Dialog et checklist de longueur variable

Résolu
johan78125 -  
linuxnico Messages postés 206 Statut Membre -
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
Configuration: Linux
Firefox 3.0.7

3 réponses

  1. linuxnico Messages postés 206 Statut Membre 10
     
    que donne

    echo ${champs[@]}

    ou plutot que contient reelement apres le dialog champs[]??
    0
  2. johan78125
     
    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
  3. linuxnico Messages postés 206 Statut Membre 10
     
    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