Script shell et menu

Script shell et menu - Shell/Batch - Programmation

Marsh Posté le 01-09-2008 à 16:17:45    

Bonjour,
 
comment faire une menu en shell qui me permet de valider une réponse avec seulement 2 choix possible ?  
 
Exemple:
1) je pose un question l'utilisateur DOIT répondre par "o" ou "n"
2) je stock la réponse dans une variable
3) si la réponse est égale à "o" ou "n" je continue l'éxecution du script, mais si ce n'est pas "o" ou "n" je reboucle sur le menu pour reposer la question.
 
 
J'ai tenter avec un until [...], j'arrive à tester une réponse, mais pas 2  :sweat:  
 
 
Merci pour votre aide !
 
 :hello:

Reply

Marsh Posté le 01-09-2008 à 16:17:45   

Reply

Marsh Posté le 01-09-2008 à 16:51:22    

Quel shell ?
 
- Dos avec .bat ? et si oui, quelle version ?
- Vbscript ?
- Unix sh ? ksh ? csh ? bash ?
- Autre ?

Reply

Marsh Posté le 01-09-2008 à 16:53:54    

Arf, autant pour moi, j'avais tellement la tête dans mon shell :)
 
Alors c'est pour un shell en bash.
 
Merci ;)

Reply

Marsh Posté le 01-09-2008 à 21:55:13    

Par exemple :

#!/bin/sh
 
OPT=
 
while [[ $OPT != 'y' ]] && [[ $OPT != 'n' ]]
do
        echo -n "Question (y/n) "
        read OPT
done
 
echo $OPT

Reply

Marsh Posté le 01-09-2008 à 22:46:45    

matafan a écrit :

Par exemple :

#!/bin/sh
 
OPT=
 
while [[ $OPT != 'y' ]] && [[ $OPT != 'n' ]]
do
        echo -n "Question (y/n) "
        read OPT
done
 
echo $OPT



 
 
Merci bien matafan !!! il me manquais la syntaxe qui imbrique le deuxième contrôle...  :hello:

Reply

Marsh Posté le 05-09-2008 à 19:51:26    

matafan a écrit :

Par exemple :

#!/bin/sh
 
OPT=
 
while [[ $OPT != 'y' ]] && [[ $OPT != 'n' ]]
do
        echo -n "Question (y/n) "
        read OPT
done
 
echo $OPT



while [ "$OPT" != "y"  -a "$OPT" != "n" ]    => un seul appel à test au lieu de 2 et les guillemets protègent du cas "variable OPT vide quand on ne rentre rien"


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 05-09-2008 à 22:00:28    

"[[ expr ]]" c'est un mot clée du shell, ça n'a rien à voir avec test. C'est "[ expr ]" qui est équivalent à test. Et avec "[[", ça marche même si OPT est vide (ce qui n'est pas le cas avec "[", comme tu le souligne).

Reply

Marsh Posté le 06-09-2008 à 08:24:47    

matafan a écrit :

"[[ expr ]]" c'est un mot clé du shell, ça n'a rien à voir avec test.


Exact. Mais je n'aime pas l'utiliser.
 
Mais c'est bien que t'y reviennes car je pose souvent ce genre d'exo à mes élèves. Et voici la solution que je leur propose en final

Code :
  1. ouinon()
  2. {
  3.     while true
  4.     do
  5.         echo -n "$* ?"
  6.         read rep
  7.  
  8.         case $rep in
  9.             [oO] | [oO][uU][iI] )  return 0;;
  10.             [nN] | [nN][oO][nN] )  return 1;;
  11.             *) echo "Mauvaise réponse"
  12.         esac
  13.     done
  14. }
  15.        
  16. if ouinon "Voulez-vous faire ceci"
  17. then
  18.    ... <on le fait>...
  19. else
  20.    ... <on le fait pas>...
  21. fi
  22.  
  23. while ouinon On continue
  24. do
  25.      ...<on continue le traitement>...
  26. done
  27.  
  28. etc...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 06-09-2008 à 10:49:08    

Finalement j'ai fait comme ceci:
 

Code :
  1. # initialise la variable, sinon le test fonctionne pas!
  2. if_cups=x
  3. while test $if_cups != o -a $if_cups != n
  4.     do
  5. echo "Exporter la configuration de cups ? o/n"
  6. read if_cups
  7.     done

Message cité 1 fois
Message édité par spamoi le 06-09-2008 à 10:51:01
Reply

Marsh Posté le 06-09-2008 à 11:09:09    

spamoi a écrit :

Finalement j'ai fait comme ceci:
 

Code :
  1. # initialise la variable, sinon le test fonctionne pas!
  2. if_cups=x
  3. while test $if_cups != o -a $if_cups != n
  4.     do
  5. echo "Exporter la configuration de cups ? o/n"
  6. read if_cups
  7.     done



 
si t avais bien lu les posts de Matafan et les miens, tu aurais vu que l'initialisation n'est pas utile quand on écrit bien les tests
 

Code :
  1. while test "$if_cups" != "o" -a "$if_cups" != "n"
  2. do
  3.     echo "Exporter la configuration de cups ? o/n"
  4.     read if_cups
  5. done


Message édité par Sve@r le 06-09-2008 à 11:10:12

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 06-09-2008 à 11:09:09   

Reply

Marsh Posté le 07-09-2008 à 18:13:18    

Ok merci du conseil ;)

Reply

Marsh Posté le 10-09-2008 à 22:00:04    

spamoi a écrit :

Ok merci du conseil ;)


En fait, ce qui aurait été vraiment super, c'est que tu trouves tout seul pourquoi dans ton while test $if_cups != o -a $if_cups != n ça ne mache pas si "if_cups" n'a pas été initialisé (ou bien su tu appuies sur "entrée" sans répondre à la question)
=> dans ce cas là, le shell voit
test != o -a != n
et là, il apprécie pas du tout. Pour lui, la commande "test" avec l'opérateur  "!=" doit avoir 2 opérandes, un situé avant et un après. Et là, il n'y a pas d'opérande avant => test:= unary operator expected => il attend un opérateur s'appliquant sur un seul opérande puisqu'il n'en voit qu'un.
 
Dans cette syntaxe: test "$if_cups" != "o" -a "$if_cups" != "n", si la variable "if_cups" est vide ou n'existe pas, le shell voit
test "" != "o" -a "" != "n" => il y a bien ce qu'il faut en opérandes => sa logique est satisfaite => ça fonctionne


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed