#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
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