web-dev-qa-db-fra.com

bash: erreur de syntaxe près du jeton inattendu `do '

J'ai essayé de chercher et je n'ai pas trouvé de réponse directe à mon problème, car tous les autres codes semblent faire ce que je fais. Je travaille sur un exercice de scripting Shell pour calculer les moyennes d'une classe et je l'ai fait jusqu'ici à l'aide de nos scripts de référence. Cependant, des erreurs de syntaxe se produisent (erreur au bas du code).

#!/bin/bash

avg=0
temp_total=0
number_of_args=$#

# First see the sufficient cmd args
if [ $# -lt 2 ] ; then
        echo -e "Oops! I need at least 2 command line args to calculate an average\n"
        echo -e "Syntax: $0: number1 number2 ... numberN\n"
        echo -e "Example:$0 5 4\n\t$0 56 66 34"
        exit 1
fi

# now calculate the average of the numbers given on command line as cmd args for i in $*
do
     # addition of all the numbers on cmd args
        temp_total='expr $temp_total + $i '
done

avg='expr $temp_total / $number_of_args '
echo "The average of all the numbers is $avg"

Donc, l'erreur que je reçois est

./avg.sh: line 16: syntax error near unexpected token `do'
./avg.sh: line 16: `do'

Je ne trouve rien de particulièrement faux autour de cette zone, alors j'espérais que quelqu'un pourrait m'aider! Merci!

edit: En particulier, j'ai essayé de supprimer les commentaires au hasard, sans succès. J'ai recopié la section aussi. J'ai également essayé de trouver différentes façons de gérer cette partie, mais la plupart des scripts de calcul de moyenne semblent le traiter de la même manière, alors je suis perdu!

2
Johnathon Smith

Le message d'erreur indique qu'un doinattendu est dû à une erreur: doest un mot réservé utilisé dans forname__, casename__, whileet untilname__. Comme le commentaire précédent se termine par for i in $*, je suppose que vous avez simplement oublié d'ajouter un saut de ligne à cet endroit:

# now calculate the average of the numbers given on command line as cmd args
for i in $*
do
  # addition of all the numbers on cmd args
  temp_total='expr $temp_total + $1 '
done

man bash/Shell GRAMMAR/Compound Commands explique comment construire foret d'autres boucles. Si vous voulez simplement boucler sur chaque argument, bashsupporte également une forme courte, je le combinerai avec bashExpansion arithmétique ici:

# now calculate the average of the numbers given on command line as cmd args
for i
do
  # addition of all the numbers on cmd args
  temp_total=$((temp_total+i))
done
7
dessert