/ shell-script: erro de sintaxe próximo do token inesperado 'done'

1

Estou recebendo syntax error near unexpected token done durante a execução do meu script de shell:

while read filename
do
  echo "$filename"
  if [ -s $filename ]; then
    tail -10 $filename | grep 'date '+%Y-%m-%d'' >> $lastlines1
    echo "- Next Error File - " >> $lastlines1
  done
  else
  echo " no errrors"
fi

Alguma idéia, para onde estou indo errado?

    
por UNIX Learner 02.01.2013 / 13:19

5 respostas

5

você está fechando o tempo antes do if.

while read filename 
do 
    echo "$filename" 
    if [ -s $filename ]
    then 
        tail -10 $filename | grep date '+%Y-%m-%d' >> $lastlines1 
        echo "- Next Error File - " >> $lastlines1 
    else 
        echo " no errrors" 
    fi
done
    
por 02.01.2013 / 13:23
4

Vamos adicionar algumas novas linhas e recuos:

1 while read filename; do
2     echo "$filename"
3     if [ -s $filename ]; then
4         tail -10 $filename | grep date '+%Y-%m-%d' >> $lastlines1
5         echo "- Next Error File - " >> $lastlines1
6     done
7 else
8     echo " no errrors"
9 fi

as linhas 6 e 9 parecem ser trocadas. Em outras palavras, as cláusulas while-do-done e if-then-else-fi estão sobrepostas. O que está errado no shell (e na maioria das outras linguagens de computador).

    
por 02.01.2013 / 13:29
1

Você precisa usar o editor vim para o script, ele mostrará o texto em VERMELHO se essa sintaxe estiver errada

while read FileName 
do 
        echo "${FileName}" 

        if [ -s "${FileName}" ]; then 
            tail -10 $FileName | grep "date '+%Y-%m-%d'" >> "${lastlines1}"
            echo "- Next Error File - " >> "${lastlines1}"
        else 
            echo " no errrors" 
        fi      
done
    
por 02.01.2013 / 13:29
1

Você precisa concluir a instrução if antes do do while . Se você estiver tentando apenas ecoar no errors uma vez, se nenhum arquivo for encontrado, será necessário usar um sinalizador para indicar isso.

errorCount=0
while read filename 
do 
    echo "$filename" 
    if [ -s $filename ]
    then 
        tail -10 $filename | grep date '+%Y-%m-%d' >> $lastlines1 
        echo "- Next Error File - " >> $lastlines1 
        errorCount=$(($errorCount + 1))
    fi
done
if [[ $errorCount -eq 0 ]]
then
    echo " no errors"
fi
    
por 02.01.2013 / 15:37
0

Às vezes, esse erro ocorre devido a caracteres CR inesperados no arquivo, geralmente porque o arquivo foi gerado em um sistema Windows que usa terminações de linha CR. Você pode corrigir isso executando dos2unix ou tr , por exemplo:

tr -d '5' < yourscript.sh > newscript.sh

Isso remove qualquer caractere de CR do arquivo e, no novo arquivo de script de shell, você não obteve esse erro.

    
por 27.02.2017 / 07:09