web-dev-qa-db-fra.com

Multiplication avec expr dans le script Shell

Je fais une calculatrice de base pour additionner, soustraire, multiplier et diviser.

L'addition fonctionne, mais pas la multiplication. Lorsque j'essaie de multiplier, j'obtiens la réponse "Vous n'avez pas exécuté le programme correctement":

$ ./calculator 4 + 5
9
$ ./calculator 4 * 5
You did not run the program correctly
Example: calculator 4 + 5

J'ai cherché sur google, où j'ai trouvé le \\* code, mais ne fonctionne toujours pas. Quelqu'un peut-il me fournir une solution ou une explication?

Voici mon code

#!/bin/bash

if [ $# != 3 ]; then  
  echo You did not run the program correctly   
  echo Example: calculator 4 + 5                
  exit 1 
fi

if [ $2 = "+" ]; then    
  ANSWER=`expr $1 + $3`    
 echo $ANSWER 
fi

if [ $2 = "*" ]; then
  ANSWER=`expr $1 \\* $3`  
  echo $ANSWER 
fi

exit 0
8
Alex Wolfe

Votre code a de nombreux problèmes. Voici un correctif. * signifie "tous les fichiers du répertoire courant". Pour désigner un astérisque/multiplication littéral, vous devez y échapper:

./calculator 3 \* 2

ou

./calculator 3 "*" 2

Vous devez également doubler la citation "$2", autrement * recommencera à signifier "tous les fichiers":

#!/bin/bash
#Calculator
#if [ `id -u` != 0 ]; then
#  echo "Only root may run this program." ; exit 1
#fi
if [ $# != 3 ]; then   
  echo "You did not run the program correctly"
  echo "Example:  calculator 4 + 5"
  exit 1
fi
# Now do the math (note quotes)
if [ "$2" = "+" ]; then echo `expr $1 + $3`
Elif [ "$2" = "-" ]; then echo `expr $1 - $3`
Elif [ "$2" = "*" ]; then echo `expr $1 \* $3`
Elif [ "$2" = "/" ]; then echo `expr $1 / $3`
fi
exit 0
16
hongo

Le * doit être échappé car il s'agit d'un caractère spécial dans la syntaxe Shell. (S'il n'est pas échappé, il sera étendu à la liste de tous les fichiers du répertoire courant). Mais vous devez utiliser une seule barre oblique inverse pour y échapper:

ANSWER=`expr $1 \* $3` 
6
hek2mgl