web-dev-qa-db-fra.com

bash entrée utilisateur si

J'essaye de faire simple

Do you want to do that? [Y,n] _

question en bash.

j'ai essayé

echo "Do that? [Y,n]"
read DO_THAT
if ["DO_THAT"="y"]; then
  do_that
fi

mais il échoue: bash: [y=y]: command not found

qu'est-ce que je fais mal??!

23
frnhr

Vous pourriez envisager d'inviter explicitement: -p et de spécifier l'entrée à 1 caractère -n1 qui permet d'insérer y sans ENTRÉE.

read -n1 -p "Do that? [y,n]" doit 
case $doit in  
  y|Y) echo yes ;; 
  n|N) echo no ;; 
  *) echo dont know ;; 
esac
50
user unknown
echo "Do that? [Y,n]"
read input
if [[ $input == "Y" || $input == "y" ]]; then
        echo "do that"
else
        echo "don't do that"
fi

Portez une attention particulière à la syntaxe et à l'espacement du si conditionnel, cela me donne tout le temps en bash :)

11
Kenny Cason

Recherchez les options pour read dans bash - vous pouvez faire l'invite, etc.

read -p "Do that? [Y,n]" -i Y input

Pour le reste, laissez des espaces autour des noms de commandes ('[' est une commande - vous pourriez même la trouver dans /bin/[ bien qu'il s'agisse également d'un shell intégré) et d'arguments.


Bash Manual, Chapter 4: Shell Builtin Commands

lis

  read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars]  
       [-p Prompt] [-t timeout] [-u fd] [name ...]

Une ligne est lue à partir de l'entrée standard ou du descripteur de fichier fd fourni comme argument à l'option '-u', et le premier mot est affecté au premier nom, le deuxième mot au deuxième nom, etc., avec les mots restants et leurs séparateurs intermédiaires affectés au nom de famille. S'il y a moins de mots lus dans le flux d'entrée que de noms, les noms restants reçoivent des valeurs vides. Les caractères de la valeur de la variable IFS sont utilisés pour diviser la ligne en mots. Le caractère barre oblique inverse "\" peut être utilisé pour supprimer toute signification particulière pour la lecture du caractère suivant et pour la continuation de la ligne. Si aucun nom n'est fourni, la ligne lue est affectée à la variable REPLY. Le code de retour est zéro, sauf si la fin du fichier est rencontrée, la lecture expire (auquel cas le code de retour est supérieur à 128), ou si un descripteur de fichier non valide est fourni comme argument à ‘-u’.

Les options, si elles sont fournies, ont les significations suivantes:

-a aname Les mots sont affectés à des indices séquentiels de la variable de tableau aname, en commençant à 0. Tous les éléments sont supprimés de aname avant l'affectation. Les autres arguments de nom sont ignorés.

-d delim Le premier caractère de delim est utilisé pour terminer la ligne d'entrée, plutôt que la nouvelle ligne. -e Readline (voir Chapitre 8 [Modification de la ligne de commande], page 93) est utilisée pour obtenir la ligne. Readline utilise les paramètres d'édition actuels (ou par défaut, si l'édition de ligne n'était pas active auparavant). -i texte Si Readline est utilisé pour lire la ligne, le texte est placé dans le tampon d'édition avant le début de l'édition.

-n nchars read renvoie après avoir lu les caractères nchars au lieu d'attendre une ligne complète d'entrée, mais respectez un délimiteur si moins de nchars caractères sont lus avant le délimiteur.

-N nchars read renvoie après avoir lu exactement les caractères nchars au lieu d'attendre une ligne complète d'entrée, sauf si EOF est rencontré ou la lecture expire. Les caractères délimiteurs rencontrés dans l'entrée ne sont pas traités spécialement et font ne provoque pas le retour de la lecture tant que les caractères nchars ne sont pas lus.

-p Invite Affiche l'invite, sans retour à la ligne avant, avant d'essayer de lire n'importe quelle entrée. L'invite ne s'affiche que si l'entrée provient d'un terminal.

-r Si cette option est donnée, la barre oblique inverse n'agit pas comme un caractère d'échappement. La barre oblique inverse est considérée comme faisant partie de la ligne. En particulier, une paire barre oblique inverse-nouvelle ligne ne peut pas être utilisée comme continuation de ligne.

-s Mode silencieux. Si l'entrée provient d'un terminal, les caractères ne sont pas répercutés.

-t timeout Cause la lecture pour expirer et retourner l'échec si une ligne complète d'entrée n'est pas lue dans les secondes de timeout. le délai d'expiration peut être un nombre décimal avec une partie fractionnaire suivant le point décimal. Cette option n'est efficace que si read lit les entrées d'un terminal, d'un tuyau ou d'un autre fichier spécial; il n'a aucun effet lors de la lecture à partir de fichiers normaux. Si le délai d'expiration est 0, la lecture renvoie la réussite si l'entrée est disponible sur le descripteur de fichier spécifié, échec sinon. L'état de sortie est supérieur à 128 si le délai est dépassé.

-u fd Lit l'entrée du descripteur de fichier fd.

6
Jonathan Leffler

Vous devez mettre un espace vide entre "si" et la variable:

if [ $var == "y" ]; then echo "ese era el problema" fi

Vous pouvez utiliser l'opérateur de modification de cas:

if [ "${DECISION^^}" = "Y" ]; then
...
fi

Vous pouvez en trouver plus dans le manuel bash sous "Expansion des paramètres".

1
niziak