Les commande "if" débutant en bash

Fermé
guigui - 19 juin 2012 à 20:06
-----geo----- Messages postés 333 Date d'inscription jeudi 7 juin 2012 Statut Membre Dernière intervention 29 mai 2014 - 22 juin 2012 à 15:42
Bonjour,
Je vient m'adresser ici, car je suis débutant dans les script.
J'ai suivie le tutoriel de " Le site du zéro " (qui fond de très bon tutoriel) mes les script avec "if et elif " j'ai beaucoup de peine a comprendre le principe, j'ai rechercher sur internet des site qui expliquer avec beaucoup d'exemple réele de script, hors je me suis rendu compte que la plupart des site sont pour des gents qui s'y connaisse....
Auriez vous des sites qui fond de bon tutoriel voir même des exercices !!

Ceci étant je veut fair un script tout simple, l'ordinateur pose une question et on doit lui réponde ( le truc tout bête)

1 #!/bin/bash

2 read -p "Bonjour quel est votre nom ? : "
3 #l'ordi attend une réponse de l'utilisateur .


4 nom="Blanche"
5 #la valeur est donc "Blanche"


6 if [ $nom = "Blanche" ]
7 # ses mon test, si l'utilisateur ne rentre pas le nom de "Blanche" le test est faut donc arrêt le if


8 then
9 echo "Salut Blanche"


10 fi

Bon ce script quand je le lance marche bien, si on rentre = Blanche l'ordi nous répond , mes si je rentre Guillaume il repond aussi !!
Je pence que mon script comporte l'erreur au niveau du "test" le reste étant juste.
J'accepte toute remarque, aide, correction, voie a suivre, pour évoluer. Je trouve sa super donc je voudrais pas rester sur une échec.
Merci a vous, et de votre aide

9 réponses

liquidus88 Messages postés 655 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 8 septembre 2012 116
Modifié par liquidus88 le 19/06/2012 à 20:16
Bonsoir,

Il est normal qu'il te réponde toujours, après avoir demander d'entrer le nom (read) tu écrit nom="blanche", si tu fixe la valeur de la variable APRÈS l'avoir demandée, il prend la nouvelle valeur (et donc ignore ce que tu as tapé). Comme tu défini la variable "nom" à "Blanche" le nom est toujours égal à Blanche, normal qu'il te réponde.

J'explique plus en détail:

read -p "Bonjour quel est votre nom:" demande le nom
Tu tapes "Blanche" => le nom est Blanche (et si tu tapes Guillaume, le nom est Guillaume)
nom="Blanche" défini le nom à Blanche, le nom est donc Blanche (ce qui fait que si tu avais tapé Blanche avant, Blanche devient Blanche, si tu avais tapé Guillaume, Guillaume devient Blanche)
if [ $nom = "Blanche" ] vérifié si le nom est Blanche, hors, la ligne précèdente (nom="Blanche") défini le nom à "Blanche", donc le nom est forcément Blanche, quelque soit celui que tu as entré en premier... la condition est remplie, il te répond.

Cordialement.

EDIT: Je t'indiques juste ton erreur, je te laisses la corriger, te donner la réponse ne serait pas instructif.
0
Merci de m'avoir répondu, j'ai compris une partie du problème, le "nom="Blanche" doit être situer AVANT la question, comme ce la je fixe ma valeur et ensuite on demande a l'utilisateur d'entrer son nom, puis le test effectue l'opération ce qui semble plus logique.
Maintenant la deuxième partit.....je bloque un peut....mes s'y je comprend, il ne faut pas que je fixe m'a valeur a "nom="Blanche" le "nom" et "Blanche" sont correcte mes pas "=" sinon le nom sera toujours égal a blanche. Je pence qu'un petit "man test" me dira ce qu'il faut
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
20 juin 2012 à 08:19
Salut,

il ne faut pas que je fixe m'a valeur a "nom="Blanche" le "nom" et "Blanche" sont correcte mes pas "=" sinon le nom sera toujours égal a blanche.
Effectivement il ne faut pas fixer de nom à l'avance, par contre après la saisie du nom il te faut tester l'existence de la variable "${nom}" ou du moins t'assurer que celle-ci n'est pas vide.

man bash : Développement

${paramètre:?mot}

Affichage d'erreur si vide ou inexistant. Si le paramètre est inexistant ou vide, le développement du mot (ou un message approprié si aucun mot n'est fourni) est affiché sur la sortie d'erreur standard et l'interpréteur termine, s'il n'est pas interactif. Sinon, la valeur du paramètre est substituée
0
liquidus88 Messages postés 655 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 8 septembre 2012 116
20 juin 2012 à 15:57
Même pas la peine de définir le nom à Blanche avant le test, la commande read va définir la valeur de la variable quand tu va entrer le nom, quand tu codes (ou que tu fais des scripts), il faut toujours aller au plus simple.
0
ok, hier j'ai prie ma journée de repos donc je mi suis pas pencher dessus, mes avec toute ses info je commence a comprendre maintenant il faut que je face marcher le script correctement, oui Liquidus88 fair au plus simple, mes je pence que en vue de m'on apprentissage il serait bon aussi de connaitre , en déclarant la valeur avant, donc je fait faire 2 script identique, 1 en déclarant ma valeur avant et une en simplifiant.
0
-----geo----- Messages postés 333 Date d'inscription jeudi 7 juin 2012 Statut Membre Dernière intervention 29 mai 2014 58
21 juin 2012 à 12:06
if...;then
...
fi


plusieurs conditions:

if ....;then
...
    elif
    .....;then
    ...
    fi
fi


après tu peux rajouter des else et chaque if, elif et else doit etre refermé par un fi
0
Bonjour, ce que tu a écrit je les bien compris est cela est bien assimiler, ce que j'ai plus de peine ses déclarer une valeur et faire les test
0
-----geo----- Messages postés 333 Date d'inscription jeudi 7 juin 2012 Statut Membre Dernière intervention 29 mai 2014 58
21 juin 2012 à 16:05
Je me corrige a ma dernière réponse j'ai dit qu'il fallait refermer chaque if, elif et else par un fi mais surtout pas les else!!! quel erreur x) bref pour ton problème j'ai 3 types de solutions:

D'abord avec une boucle peut etre que tu n'en veux pas mais parfois utile pour forcer la personne a entrer la bonne réponse, le script ne s'arrète pas il sort de la boucle une fois qu'il a récupérer la valeur qu'il demande:

#/bin/sh

echo -n "veuillez entré votre prenom: "
read prenom

while [ "$prenom" != Blanche ]

       do
             echo
             echo "Saisie incorrect"
             echo -n "Veuillez ressaisir votre prénom: "
             read prenom
       done

echo "Vous etes bien la personne que je cherche, vous etes $prenom"

exit 0

Le deuxième exemple toujours pareil avec la boucle while mais j'ai vu que ta valeur été prédéfini alors voila ce que sa pourrait donner:

#/bin/sh

valeur=Blanche
echo -n "veuillez entré votre prenom: "
read prenom

while [ "$prenom" != $valeur ]

       do
             echo
             echo "Saisie incorrect"
             echo -n "Veuillez ressaisir votre prénom: "
             read prenom
       done

echo "Vous etes bien la personne que je cherche, vous etes $prenom"

exit 0

Et enfin le dernier exemple avec ton if ^^':

#/bin/sh

valeur=Blanche
echo -n "veuillez entré votre prenom: "
read prenom

if [ "$prenom" != $valeur ];then
echo "Saisie incorrecte"
    else
    echo "Vous etes bien la personne que je cherche"
fi

exit 0

Et pour le fun j'ai aussi fait le code avec le if sans la valeur prédéfinie:

#/bin/sh

echo -n "veuillez entré votre prenom: "
read prenom

if [ "$prenom" != Blanche ];then
echo "Saisie incorrect"
    else echo "Vous etes bien la personne que je cherche"
fi

exit 0


Voila alors le -n après echo c pour que la saisie se fasse a la meme ligne et mes echo avec rien derrière c'est normal s'est pour faire de la place je prefere ainsi après le design c'est une autre histoire tu change a ta guise mais bon tout collé enchainé je trouve sa moins lisible :P
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
A chaque foi tu mes la saisie correcte en dernier y a t'il une ré son particulier a cela? je suis en trin d'étudier ce que tu a écrit est voir les erreur que j'ai pue faire... de plus je constate qu'a chaque fin de script il y a " exit 0 " je suppose que ses pour indiquer a bash la fin de script ? dans mes cour nul par il en parle...
0
je voi dans la ligne [ "$prénom != blanche ] dans tout les exemple tu utilise le signe "!=" il faut donc le test du "prénom a sa valeur saisie , valeur enregistrer Blanche, ne pourrais t'on pas faire : [ blanche -o Blanche ] expr1 -o expr2
Vrai si expr1 ou expr2 est vraie. comme cela si l'utilisateur ne met pas de majuscule le résulta et bon?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
Modifié par zipe31 le 22/06/2012 à 12:16
Salut,

Utilise les doubles crochets pour ça :
if [[ ${prenom} != [Bb]lanche ]]

Une autre façon de faire :
#/bin/bash 

while : 
do 
echo -n "Veuillez entrer votre prénom : " 
read prenom 

if [[ ${prenom} != [Bb]lanche ]] 
    then 
       echo "Saisie incorrecte." 
       continue 
    else 
       echo "Vous êtes bien la personne que je cherche." 
       break 
fi 
done
0
-----geo----- Messages postés 333 Date d'inscription jeudi 7 juin 2012 Statut Membre Dernière intervention 29 mai 2014 58
22 juin 2012 à 11:26
exit 0 wai c'est pour eviter que le script s'arete et le terminal reste inerte il sort du script quoi, et après pour le test prénom oui majuscule ou pas tu change ta variable a ta guise tu met ce que tu veux et te complique pas la vie avec les expr t'en a pas vraiment besoin
0
ok ses super cool de votre par de prendre du tempt a m'expliquer, je commence a mieux comprendre le principe, il faut que je m'exerce, je trouve les script super intéressant et très motiver , sa m'embêter de rester bloquer, je suis persuader que l'on doit pouvoir faire plein de chose avec les script.
0
-----geo----- Messages postés 333 Date d'inscription jeudi 7 juin 2012 Statut Membre Dernière intervention 29 mai 2014 58
22 juin 2012 à 15:42
tu n'imagine pas si bien dire^^' et oui zipe31 ta raison j'avais zapé les crochets x)
0