Por que este erro é "linha 26: Erro de sintaxe perto do token inesperado 'concluído'?

1
for (( i=1; i<= $numberstudent; i++ ))
     do
      head -n $i fullstudentsMarks | tail -n 1 > $(cut -f 2 -d ' ')
      npassed=0
      sum=0
      average=0
      for (( j=3; j<= 10; j++ ))
      do
        mark=$(cut -f $j -d ' ' $(cut -f 2 -d ' ' fullstudentsMarks))
        if ($mark>=60)
        then
         $npassed=$npassed+1
        fi
        $sum=$sum+mark
      done
      $average=$sum / $npassed
      if ($npassed==8);then
       result="successful"
      else if ($npassed>=5);then
        result="trans"
      else
       result="lost"
      fi
      idstudent=$(head -n $i fullstudentsMarks | tail -n 1 | cut -f 1 -d ' ')
      echo $idstudent+" "+$reslut+" "+$average >> resandavg
     done
    
por hakim alhaj 04.01.2017 / 17:46

1 resposta

1

Por favor, cole seu script em ShellCheck . Ele fornecerá muitas mensagens de erro apontando para pedaços do código que não estão totalmente corretos.

Mas você nunca deveria ter terminado lá. Você deveria ter testado o roteiro uma dúzia de vezes antes mesmo de escrever a linha $average=$sum / $npassed .

Em geral, quando você faz qualquer tipo de programação: Não deixe o teste até o final, esperando que um programa seja executado perfeitamente quando você tiver escrito tudo. É melhor testar seu código incrementalmente enquanto você o escreve. É particularmente fácil de fazer com scripts de shell, já que não há etapa de compilação envolvida.

> Ninguém escreve um script de shell completo com lógica ainda moderadamente complexa e analisa corretamente na primeira tentativa (e se o fizer, provavelmente terá sorte e ficará surpreso).

Por exemplo, você pode começar com

for (( i = 1; i <= numberstudent; i++ )); do
  echo "$i"
done

Isso funciona? Por que não? Bem, numberstudent não tem valor. Nós vamos fingir que é 23.

Em seguida, adicione uma nova linha e teste novamente:

numberstudent=23
for (( i = 1; i <= numberstudent; i++ )); do
  head -n "$i" fullstudentsMarks | tail -n 1 > $(cut -f 2 -d ' ')
done

O que aconteceu lá? Por que recebo "nenhum arquivo ou diretório" ou "redirecionamento ambíguo"? O que eu até queria que essa linha fizesse? Bem, muito foi adicionado ao roteiro de uma só vez, basta recuar um pouco:

numberstudent=23
for (( i = 1; i <= numberstudent; i++ )); do
  head -n "$i" fullstudentsMarks | tail -n 1
done

Lá, agora ele escolhe a linha correspondente a $i de fullstudentsMarks e a exibe. (Eu não sei se isso é o que você realmente pretende)

Mas, oh, numberstudent precisa ser o número de linhas no arquivo! Ok.

numberstudent="$( wc -l <fullstudentsMarks )" 
for (( i = 1; i <= numberstudent; i++ )); do
  head -n "$i" fullstudentsMarks | tail -n 1
done

E assim por diante, até que você tenha um script onde cada linha faça o que você quer e até que você saiba que está fazendo corretamente (e você sabe disso porque você testou o script depois de quase todas as linhas adicionadas). / p>     

por 04.01.2017 / 19:01