bash: erro de sintaxe próximo do token inesperado 'do'

2

Tentei pesquisar e não consegui encontrar uma resposta direta para o meu problema, pois todos os outros códigos parecem estar fazendo o que estou fazendo. Eu estou trabalhando em um exercício de shell script para calcular as médias de uma classe, e eu cheguei a este ponto usando nossos scripts de referência, no entanto estou recebendo erros sobre a sintaxe (erro na parte inferior do código)

#!/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"

Então, o erro que estou recebendo é

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

Não consigo encontrar nada particularmente errado nessa área, então eu esperava que alguém pudesse me ajudar! Obrigado!

Editar: em particular, tentei remover os comentários sobre a chance de que eles estavam causando problemas, sem sucesso. Eu re-digitei a seção também. Eu também tentei encontrar maneiras diferentes de lidar com essa parte, mas a maioria dos scripts de média parece lidar com isso de uma forma muito semelhante, então estou perdida!

    
por Johnathon Smith 03.04.2018 / 23:43

1 resposta

6

A mensagem de erro reclama de um do inesperado porque você usou errado: do é uma palavra reservada usada em for , case , while e until loops. Como o comentário anterior termina com for i in $* , presumo que você acabou de esquecer de adicionar uma quebra de linha:

# 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 / Comandos compostos explica como criar for e outros loops. Se você quiser simplesmente fazer um loop em todos os argumentos bash também suporta um formato abreviado, vou combiná-lo com bash Arithmetic Expansão aqui:

# 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
    
por dessert 04.04.2018 / 00:29