Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[shell] commande read et test
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
kabouns
n00b
n00b


Joined: 16 Dec 2004
Posts: 31

PostPosted: Wed Jan 26, 2005 9:00 am    Post subject: [shell] commande read et test Reply with quote

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
View user's profile Send private message
Trevoke
Advocate
Advocate


Joined: 04 Sep 2004
Posts: 4099
Location: NY, NY

PostPosted: Wed Jan 26, 2005 2:01 pm    Post subject: Reply with quote

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
View user's profile Send private message
TGL
Bodhisattva
Bodhisattva


Joined: 02 Jun 2002
Posts: 1978
Location: Rennes, France

PostPosted: Wed Jan 26, 2005 4:08 pm    Post subject: Re: [shell] commande read et test Reply with quote

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:
Code:
echo "$uid$i"
ou si c'est pour mettre le résultat dans une nouvelle variable:
Code:
foo="$uid$i"


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
View user's profile Send private message
yoyo
Bodhisattva
Bodhisattva


Joined: 04 Mar 2003
Posts: 4273
Location: Lyon - France

PostPosted: Thu Jan 27, 2005 8:47 am    Post subject: Re: [shell] commande read et test Reply with quote

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
View user's profile Send private message
yuk159
Veteran
Veteran


Joined: 18 Apr 2003
Posts: 1801
Location: noumea ,nouvelle-caledonie

PostPosted: Thu Jan 27, 2005 8:22 pm    Post subject: Reply with quote

Et il est dispo ici en français : http://www.bsdbooks.net/shells/scripting/fr/index.html
_________________
The box said: "Requires Windows 98/2000/XP/NT, or better."
So, I installed LINUX!
un blog de plus :)
Back to top
View user's profile Send private message
razer
l33t
l33t


Joined: 08 Oct 2004
Posts: 893
Location: Paris - France

PostPosted: Thu Jan 27, 2005 10:36 pm    Post subject: Reply with quote

Une autre mine d'or sur papier :
http://www.eyrolles.com/Informatique/Livre/9782212114058/livre-scripts-sous-linux.php
Back to top
View user's profile Send private message
razer
l33t
l33t


Joined: 08 Oct 2004
Posts: 893
Location: Paris - France

PostPosted: Thu Jan 27, 2005 10:48 pm    Post subject: Re: [shell] commande read et test Reply with quote

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
View user's profile Send private message
Pachacamac
Veteran
Veteran


Joined: 22 Nov 2003
Posts: 1264
Location: Paris - France

PostPosted: Tue Feb 01, 2005 7:19 pm    Post subject: Reply with quote

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
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
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