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>