Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/03/2013, à 14:21

Havany

[RESOLU]Comportement étrange de la commande read

Bonjour à tous,


Dans un script me permettant de créer des utilisateurs ldap à partir d'une liste et qui vérifie qu'un utilisateur homonyme n'existe pas déjà dans la base, j'ai un problème avec une fonction qui contient une commande read pour lire la réponse de l'utilisateur. Voici le script :

#!/bin/bash

[[ ! $1 ]] && echo "Veillez donner une liste de nom pour créer les comptes..." && exit 1

tmpf="/tmp/info_user"
smail="/tmp/info_user_mail"

#u=titi

function modify {
fin=0
while [ $fin -ne 1 ]; do
   clear
   echo -en "Quels champs voulez-vous modifier ?

1 - Prénom : $p
2 - Nom : $n
3 - Utilisateur : $u
4 - mail : $m
0 - Fin de modification

Choix : ?\b"
   read ans2

   case $ans2 in
      1)
         echo -en "Modifier le prénom $p : \b";
         read p;;
      2)
         echo -en "Modifier le nom $n : \b";
         read n;;
      3)
         echo -en "Modifier l'utilisateur $u : \b";
         read u;;
      4)
         echo -en "Modifier le mail $m : \b";
         read m;;
      0)
         echo "Fin de la modification...";
         fin=1;;
   esac

done

uex
}


function uex {
   annul=0
   ans1=0
   eu="$(ldapsearch -xLLL -H ldap://hostname -b "uid=$u,ou=Users,dc=domaine,dc=loc" 2>/dev/null |grep sn: |awk '{print $2}')"
   while [[ $u == $eu && $annul -ne 1 ]]; do
      clear
      info=$(ldapsearch -xLLL -H ldap://hostname -b "uid=$u,ou=Users,dc=domaine,dc=loc" 2>/dev/null |grep -E "cn|sn|mail" |sed 's/cn:/Prénom Nom :/g ; s/sn:/Login :/g ; s/mail:/Mail :/g')

      echo -en "Attention l'utilisateur $u existe déjà dans la base ldap :\n\n$info\n\nVoulez-vous annuler la création de cet utilisateur ou modifier manuellement cet utilisateur [A/M] ? " 
      read ans1

      case $ans1 in
         M|m)
            modify
            cont=1;;
         A|a)
            annul=1
            cont=1
            echo "L'utilisateur $u ne sera pas créé...";;
         *)
            clear
            echo "Réponse inconnue, choisissez A pour annuler ou M pour modifier..."
            sleep 3;;
      esac

   eu="$(ldapsearch -xLLL -H ldap://hostname -b "uid=$u,ou=Users,dc=domaine,dc=loc" |grep sn: |awk '{print $2}')"
   done
}

echo "======================================="

cat $1 | while read line; do

   lu=$(echo $line | awk -F, '{print $1}')
   m=$(echo $line | awk -F, '{print $2}')
   p=$(echo $lu | awk '{print $1}')
   n=$(echo $lu | awk '{print $2}')
   u="$(echo $p | cut -b 1 | tr '[[:upper:]]' '[[:lower:]]' |sed "s/[é|ê|è]/e/g ; s/à/a/g")$(echo $n | tr '[[:upper:]]' '[[:lower:]]' |sed "s/[é|ê|è]/e/g ; s/à/a/g")"

   uex

done

Quand j'appelle la fonction uex depuis la boucle "while read" j'ai droit à une boucle infinie et la commande "read ans1" n'attend pas de réponse de l'utilisateur.
Par contre si je m'amuse a sortir la fonction uex du "while read" la fonction uex attends bien la réponse de l'utilisateur au niveau du read ans1.

Bien évidemment je dois absolument appeler cette fonction uex dans la boucle "while read"...

Quelqu'un aurait-il une solution ?
Merci d'avance....

PS : je n'ai laissé dans le script que les parties qui me posent problème...

Dernière modification par Havany (Le 27/03/2013, à 15:01)

Hors ligne

#2 Le 27/03/2013, à 14:44

Totor

Re : [RESOLU]Comportement étrange de la commande read

normal, dans ta fonction, l'entrée standard est la même que celle de ta boucle. du coup, le read ans1 lit la ligne suivante du fichier $1

bref, il faut que tu repenses ton script et que tu passes par un fd alternatif pour ta boucle.
nesthib, pingouinux ou autre prendront certainement le temps de corriger tout cela si tu as besoin (ce que je pense au vu de ton script)...

Dernière modification par Totor (Le 27/03/2013, à 14:45)


-- Lucid Lynx --

Hors ligne

#3 Le 27/03/2013, à 15:00

Havany

Re : [RESOLU]Comportement étrange de la commande read

Totor a écrit :

normal, dans ta fonction, l'entrée standard est la même que celle de ta boucle. du coup, le read ans1 lit la ligne suivante du fichier $1

Merci beaucoup...

Du coup j'ai remplacé mon while read par un for... Bon je trouve pas ça très joli pour lire un fichier mais ça me permet de contourner le problème du STDIN.


Merci encore...

Hors ligne