Dialog et checklist de longueur variable

Résolu
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. que donne

    echo ${champs[@]}

    ou plutot que contient reelement apres le dialog champs[]??
    0
    1. 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
      1. 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