View previous topic :: View next topic |
Author |
Message |
kabouns n00b
Joined: 16 Dec 2004 Posts: 31
|
Posted: Wed Jan 26, 2005 9:00 am Post subject: [shell] commande read et test |
|
|
Bonjour à tous,
Je suis en train de faire un petit programme pour mes cours en shell.
Voila je dois faire un prog qui permet de créer un utilisateur.(Login,UID,GID...). Si le login et l'UID existe deja je dois l'annoncer. Si l'utilsateur ne renseigne rien alors une valeur par defaut lui est affectée.
exemple de code :
tput cup ...........; echo -n "Login:"; read login
while grep $login /etc/passwd
do
echo "Le login existe deja".
exit ###Me jette du programme
done
log=$login
tput cup ...........; echo -n "UID:"; read uid
while grep $uid /etc/passwd
do
echo "L'uid existe deja".
exit
done
ui=$uid
tput cup ...........; echo -n "GID:";read gid
if grep $gid /etc/group ###Ce test ne marche pas
then
grp=$gid
else
groupadd $gid
grp=$gid
fi
En fait j'aimerais savoir comment manipuler des retours de commande du genre :
Si grep $uid /etc/passwd =0 then.............
De plus pour les valeurs par defaut quand rien n'est rentré je pensais faire :
if test -z $uid then......
le prob c'est que quand rien est rentré mon test ne marche pas (entrée dois quand meme ajouter une valeur)
Et enfin comment concatener par ex : $uid et $i
Voila mon message est long j'espere que ca va pas vous souler.
Je suis débutant.
Merci beaucoup |
|
Back to top |
|
|
Trevoke Advocate
Joined: 04 Sep 2004 Posts: 4099 Location: NY, NY
|
Posted: Wed Jan 26, 2005 2:01 pm Post subject: |
|
|
Bah pour les if c'est comme ca:
if [ $# -ne 1 ] ; then
echo "Usage: $0 command" >$2 ; exit 1
fi
Note le ; avant le then.
fi = fin de if.
[ ] situation _________________ Votre moment detente
What is the nature of conflict? |
|
Back to top |
|
|
TGL Bodhisattva
Joined: 02 Jun 2002 Posts: 1978 Location: Rennes, France
|
Posted: Wed Jan 26, 2005 4:08 pm Post subject: Re: [shell] commande read et test |
|
|
kabouns wrote: | tput cup ........... |
Sincèrement, pour un petit script comme ça, pas la peine de jouer avec le terminal. Enfin moi ce genre de trucs ça m'enerve plus qu'autre chose perso.
kabouns wrote: | echo -n "Login:"; read login
while grep $login /etc/passwd
do
echo "Le login existe deja".
exit ###Me jette du programme
done
log=$login |
Alors, plusieurs choses:
- pourquoi un while, alors que tu ne boucles pas ? Fait un if plutôt. Le while serait intérressant si tu voulais redemander un login différent, par exemple: Code: | while [ -z "$log" ] ; do
echo -n "Login (empty to quit):"
read login
if [ -z "$login" ] ; then
echo "Aborted."
exit
elif <test_si_le_login_existe_déjà> ; then
echo "Sorry, there is already an user called $login"
else
log="$login"
fi
done |
- pour le <test_si_le_login_existe_déjà>, plusieurs choses encore :
-- déjà, utiliser l'option "-q" de grep serait une bonne idée. Elle ne produit pas de sortie standard, mais juste un code de retour qui peut servir de condition dans ton if;
-- ensuite, faire un grep du login sur tout le fichier t'expose à des bugs : tu fais comment pour ajouter un utilisateur "foo" si il y a déjà "foobar" ? Ton expression régulière ne doit tester que le premier champs des lignes du fichier, et s'assurer que c'est l'intégralité du champs qui correspond.
Je suggère donc: Code: | ...
elif grep -q "^$login:" /etc/passwd ; then
... | (le "^" pour t'assurer que c'est en début de ligne, et le ":" à la fin pour t'assurer que tu va jusqu'au bout du 1er champ)
Quote: | ...
while grep $uid /etc/passwd
... |
Bon, même topo ici, la structure du while devrait être changée. Et pour ce qui est de tester si l'uid existe déjà, deux point sur lesquels il faut se méfier :
- ne pas croire que "101" existe déjà parcequ'il y a déjà un uid "1010".
- ne pas croire que l'uid "101" existe déjà parcequ'il y a déjà un gid (bref, tester uniquement le bon champs)
Il y a plusieurs façon de travailler uniquement sur un champs donné d'un fichier du style de /etc/passwd, mais avec uniquement grep c'est mal adapté (dans le cas du login, ça allait parcequ'en début de ligne, mas c'est un cas particulier). Qu'est-ce que tu es censé connaitre pour l'instant comme commande ? "awk" ou "gawk", tu les as vu ? Ou bien "cut" peut-être ? Je voudrais pas non plus te donner des solutions hors-programme
Quote: | En fait j'aimerais savoir comment manipuler des retours de commande |
Ce qu'il faut savoir, c'est qu'une commande retourne deux chose:
- son code de sortie, zero ou un autre nombre. Le 0 est un succès, les autres sont des échecs. Dans un "if commande ; then ...", on va dans le then si la commande à retourné 0. Par exemple, un "grep -q ..." va retourner 0 si il a trouvé au moins une occurence de ce qu'on cherchait.
- sa sortie standard (par exemple, un grep sans option va t'afficher les occurence qu'il trouve, ou un "grep -c" va t'afficher le nombre d'occurence trouvée, etc.). Pour en faire une condition pour un if, il faut récuperer cette sortie et faire un test dessus. Exemple pour savoir si il y a au moins 3 fois "toto" dans /etc/plop : Code: | if [ `grep -c toto /etc/plop` -ge 3 ] ; then ...
ou bien
if test `grep -c toto /etc/plop` -ge 3 ; then ...
| Ici, les "`" autour du grep dénotent un sous-shell, c'est à dire que la commande grep va être executée dans un autre processus, puis qu'on executera le "if ..." en remplaçant le `grep ...` par ce que cet autre processus aura produit comme sortie standard (un nombre ici).
Quote: | if test -z $uid then...... |
Trois choses :
- il faut des guillemets autour de ta variable ("$uid"), pour qu'elle existe quand même comme paramètre de la commande "test" même si elle est vide.
- le "if" et son "then" doivent soit être sur 2 lignes différentes, soit séparés par un ";" (qui en shell a la même signification qu'un retour à la ligne)
- dans la vrai vie, on voit rarement "test" utilisé, mais plutôt la forme "if [ ton_test ]" comme dans mon code au dessus.
Quote: | Et enfin comment concatener par ex : $uid et $i |
On utilise à la suite les deux variables, tout simplement. Si c'est pour les afficher: ou si c'est pour mettre le résultat dans une nouvelle variable:
Bon, et puis pour finir, deux conseils plus généraux :
- ne pas sêcher ses cours de shell, et bien écouter même si ça peut paraitre incroyablement chiant et absurde et rébarbatif. Perso j'avais tout sêché par snobisme parceque j'avais décidé que c'était pourri comme langage (et ça l'est) et que ça devrait disparaitre...
Bon bah j'ai bien regretté après, parceque c'est ça qui existe et qui utilisé, donc j'ai du apprendre par moi même et en retard. Et puis même si c'est pourri, y'a vraiment moyen de s'amuser en fait une fois passés les éceuils des débuts, enfin perso j'y ai pris goût.
- le Advanced Bash-Scripting Guide est une mine d'or, à consulter absolument. Faut voir que une fois que tu auras qlqs rudiments, c'est en lisant et modifiant du code existant que tu continueras de progresser en shell, et l'ABSG il en est plein, donc c'est parfait. |
|
Back to top |
|
|
yoyo Bodhisattva
Joined: 04 Mar 2003 Posts: 4273 Location: Lyon - France
|
Posted: Thu Jan 27, 2005 8:47 am Post subject: Re: [shell] commande read et test |
|
|
TGL wrote: | - le Advanced Bash-Scripting Guide est une mine d'or, à consulter absolument. Faut voir que une fois que tu auras qlqs rudiments, c'est en lisant et modifiant du code existant que tu continueras de progresser en shell, et l'ABSG il en est plein, donc c'est parfait. | À noter qu'un ebuild est dispo pour ce guide : abs-guide .
Enjoy ! _________________ La connaissance s'accroît quand on la partage.
JCB |
|
Back to top |
|
|
yuk159 Veteran
Joined: 18 Apr 2003 Posts: 1802 Location: noumea ,nouvelle-caledonie
|
|
Back to top |
|
|
razer l33t
Joined: 08 Oct 2004 Posts: 893 Location: Paris - France
|
|
Back to top |
|
|
razer l33t
Joined: 08 Oct 2004 Posts: 893 Location: Paris - France
|
Posted: Thu Jan 27, 2005 10:48 pm Post subject: Re: [shell] commande read et test |
|
|
TGL wrote: | Perso j'avais tout sêché par snobisme parceque j'avais décidé que c'était pourri comme langage (et ça l'est) et que ça devrait disparaitre...
Bon bah j'ai bien regretté après, parceque c'est ça qui existe et qui utilisé, donc j'ai du apprendre par moi même et en retard. Et puis même si c'est pourri, y'a vraiment moyen de s'amuser en fait une fois passés les éceuils des débuts, enfin perso j'y ai pris goût.
|
Pourri, je crois que tu exagères un peu...
Je trouve le bash parfaitement adapté aux tâches qui lui incombent, donc les travaux "rébarbatifs"; comme tu le sais il est beaucoup plus puissant qu'il n'y paraît au premier abord.
Je comprends que quand on a l'habitude des langages compilés on puisse trouver çà "pourri", mais l'usage n'est pas du tout le même...
Pour les travaux d'admin, c'est parfait. Pour des trucs un peu plus complexes, demandant des tests plus poussés et du debuggage, il y a perl, python, et ruby. Seulement pour des taches très simples je trouve le bash plus pratique à mettre en oeuvre, notament pour faire des appels vers toutes les commandes shell qui font la souplesse de notre OS...
Enfin c'est la vision d'un gars pour qui la programmation se résume aux scripts... Le C, à mon grand regret, je connais très mal. |
|
Back to top |
|
|
Pachacamac Veteran
Joined: 22 Nov 2003 Posts: 1264 Location: Paris - France
|
Posted: Tue Feb 01, 2005 7:19 pm Post subject: |
|
|
Le bash est très bien puisqu'il permet l'utilisation de différents outils déjà tout prêt; Il ne reste plus qu'a savoir les manipuler...
Un avantage très important par rapport au C concerne les entrées/sorties, la gestion des fichiers et des chaines. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|