Erro “syntax error near unexpected token” no bash: Aprenda a resolver

Compartilhe:

estudante resolvendo o erro "syntax error near unexpected token" no Bash

Se você desenvolve shell scripts em sistemas operacionais GNU/Linux, é bastante provável que já tenha se deparado com a incômoda mensagem de erro “syntax error near unexpected token” ao tentar executar um script ou uma linha de comando.

Ao longo deste artigo, você vai entender porque esse erro ocorre, analisando erros de sintaxe envolvendo os comandos condicionais “if” e “case”, estruturas de repetição “for” e funções no bash.

Será apresentado exemplos práticos de códigos incorretos que dispara o erro, seguidos por suas respectivas soluções, para você compreender exatamente onde a falha ocorreu e como corrigi-la rapidamente.

Entendendo o erro “syntax error near unexpected token”

O erro “syntax error near unexpected token” indica que o interpretador bash encontrou um token (palavra reservada, símbolo ou operador) em um ponto do código onde ele não era esperado, interrompendo a interpretação do script ou linha de comando.

Ao interpretar o código de uma estrutura condicional, loop ou funções o bash espera encontrar determinados elementos em uma ordem específica. Por exemplo, após o “if” ele espera um comando ou condição, logo depois espera ter um “; then” ou “thenem uma nova linha e o resto da estrutura.

Quando é identificado que uma “palavra reservada”, “símbolo” ou “operador” está ausente ou foi escrito incorretamente, encontrando algo que não faz sentido naquele contexto, o shell interrompe a execução e informa qual foi o token “inesperado” encontrado.

Por esse motivo, a mensagem normalmente possui este formato: syntax error near unexpected token `TOKEN’.

O TOKEN representa apenas o ponto em que o Bash percebeu que a estrutura do código da linha de comando ou script ficou inconsistente. A seguir uma referência rápida para alguns erros de tokens informados na mensagem:

Token informado no erroPossível CausaPossível Solução
thenFalta “;” (ponto e vírgula), quebra de linha ou erro na instrução “if”.Adicione “; then” ou coloque “then” na linha seguinte.
doFalta “;” (ponto e vírgula) ou quebra de linha no “for” ou “while”.Adicione “; do” ou coloque o “do” na linha seguinte.
fiBloco “if” incompleto ou ausência da instrução “then”.Confira se o “if” possui a instrução “then” e comandos válidos.
doneAusência da instrução “do”.Confira se o laço possui a instrução “do” e comandos válidos.
esacAusência de “;;” entre os padrões, erro na palavra reservada “in” ou fechamento “esac” em posição incorreta.Verifique se a estrutura de cada padrão termina com “;;” ou se o bloco é encerrado com “esac”.
(Shell incorreto, string sem aspas.Use bash e adicione o caractere entre aspas.
)Parênteses não correspondentes.Verifique se todos “(” têm o “)”.
{Chave de fechamento sem abertura correspondente.Verifique se todos “{” têm o “}”.
}Falta espaço após “{“ ou chave usada em posição inválida.Escreva { comando; } e confira a sintaxe.

É importante saber que nem sempre o token exibido na mensagem é o verdadeiro causador do problema, em alguns casos, o erro verdadeiro está uma ou algumas linhas antes, o nome do token aparece porque o bash encontrou o erro naquele ponto do código.

Erro de sintaxe gerado por causa dos parênteses

No shell bash, os “()” parênteses têm significados especiais de sintaxe dependendo de como e onde são utilizados. A seguir será apresentado na prática exemplos de erros, porque são causados e a respectiva solução envolvendo o uso de parênteses.

Parênteses não fechados

Situação: você tenta executar o script que tem o seguinte código:

Erro exibido no terminal: unexpected EOF while looking for matching `)’

Causa do erro: Ao executar o script o bash continuou procurando pelo caractere “)parênteses de fechamento até o fim do arquivo e não o encontrou, por isso na imagem acima o erro é reportado na linha 8.

Solução: Certifique-se de que todos os parênteses abertos foram devidamente fechados.

Uso de parênteses em nomes de arquivos sem escape

Situação: você executa o comando ls para listar as propriedades do arquivo “relatorio (1).pdf”:

Erro exibido no terminal: bash: syntax error near unexpected token `(‘

Causa do erro: O bash interpreta os “()” parênteses não como o nome literal do arquivo, mas como uma instrução de subshell, e como não corresponde a uma construção válida da linguagem, o bash gera o erro.

Solução: Envolva o nome do arquivo em aspas simples ou duplas ou use a “\” (barra invertida) antes de cada parênteses e espaço para o shell bash ignorar a função dos parênteses.

Erro de sintaxe gerado pela ausência de citações (quotes)

O uso incorreto de citações (aspas duplas e simples) pode causar desde falhas na execução do comando e comportamentos inesperados ao manipular nomes de arquivos com espaços.

Aspas não fechadas (Unterminated quoted string)

Situação: Comando echo imprime string entre aspas duplas, mas você esquece de fechá-la antes de pressionar a tecla ENTER na linha de comando ou no script. Veja um exemplo:

Erro exibido no terminal: unexpected EOF while looking for matching `”‘

Causa do erro: O bash considera que tudo o que vem após as aspas de abertura faz parte da mesma string até encontrar a aspa correspondente de fechamento. Como um dos comandos não fechou as aspas o erro é disparado.

Solução: Adicione a aspa de fechamento para encerrar o bloco de texto.

Excesso de aspas e não fechamento delas

Situação: Ao declarar uma variável dentro de um shell script como mostrado a seguir:

Erro exibido no terminal: unexpected EOF while looking for matching `”

Causa do erro: Antes de declarar a variável o bash valida a sintaxe, e como existem 3 aspas simples, ele identifica que é necessário o fechamento de uma delas.

Solução: Envolva o valor da variável após o caractere “=” em aspas simples ou duplas, ficando uma no início e outra no fim.

Erros de sintaxe ao executar o comando if

O erro “syntax error near unexpected token” ocorre no comando “if” principalmente na ausência do caractere “;” (ponto e vírgula) antes do “then” na mesma linha e omissão completa da palavra reservada “then”.

Abaixo, veremos cenários de erro de sintaxe mais comuns e como corrigi-los:

Falta do “;” antes da palavra reservada “then”

Situação: Ao executar um shell script com o seguinte código:

Erro exibido no terminal: syntax error near unexpected token `fi’

Causa do erro: Ao lê o código do comando if e chegar ao fim da estrutura condicional, o bash não executa o código porque não encontrou a instrução “then” em uma nova linha.

Solução: Inserir o “;” antes do “then” ou mover o “then” para uma nova linha abaixo.

Ausência do “fi” no final do bloco

Situação: A seguinte estrutura condicional é executada em um script:

Erro exibido no terminal: syntax error: unexpected end of file

Causa do erro: O bloco foi encerrado sem a palavra reservadafi” em uma nova linha.

Solução: Fechar corretamente o bloco condicional “if” com “fi”.

Fechamento incorreto da palavra reservada “else”

Situação: Ao tentar executar na linha de comando o código abaixo:

Erro exibido no terminal: bash: syntax error near unexpected token `;’

Causa do erro: Existe o caractere “;” (ponto e vírgula) após o “else” e não é necessário acrescenta-lo.

Solução: Remover pontuações inválidas após o “else”, no exemplo, o “;” (ponto e vírgula).

Para aprender mais sobre o funcionamento e a sintaxe oficial das estruturas condicionais, consulte a documentação do shell bash oficial.

Erros de sintaxe ao executar o comando case

A estrutura de decisão “case” possui uma sintaxe que exige a cada opção de teste ser finalizada com um caractere duplo de ponto e vírgula;;” e que todo o bloco seja encerrado com a instrução “esac”.

A seguir será apresentado na prática alguns erros de sintaxe e as soluções envolvendo o comando “case”.

Omissão do “;;” entre as opções de teste

Situação: Ao tentar executar o código abaixo em um shell script:

Erro exibido no terminal: syntax error near unexpected token `)’

Causa do erro: No exemplo, o primeiro teste (caso) não foi encerrado com o “;;” (duplo ponto e vírgula), logo o próximo token é inesperado e o erro é gerado.

Solução: Adicionar os dois “;;” (ponto e vírgula) ao final de cada instrução de caso.

Ausência da instrução de encerramento “esac”

Situação: Estrutura condicional “case” é executada com o seguinte código:

Erro exibido no terminal: syntax error: unexpected end of file

Causa do erro: A estrutura condicional “case” não foi encerrada com a instrução “esac”.

Solução: Finalizar o bloco “case” com a palavra reservada “esac”.

Erros de sintaxe ao executar o comando for

A estrutura de repetiçãofor” exige o acompanhamento das palavras reservadas “do” (para iniciar o bloco de execução) e “done” (para fechar o laço de repetição).

Abaixo será apresentado alguns exemplos que mostram como o erro “syntax error near unexpected token” é disparado ao utilizar os laços de repetição “for“.

Instrução “do” não está em uma nova linha

Situação: Caso tente executar o código abaixo em um script:

Erro exibido no terminal: syntax error near unexpected token `echo’

Causa do erro: A instrução “do” não está em uma nova linha ou precedida do “;” (ponto e vírgula) para iniciar a execução dos comandos no loop “for”.

Solução: Inserir o “;” antes de “do” ou separá-lo com quebra de linha.

Inserção do “done” na mesma linha sem o separador “;”

Situação: O loop “for” a seguir está em um script, ao tentar executa-lo:

Erro exibido no terminal: syntax error: unexpected end of file

Causa do erro: O shell bash lê o loop “for” mas não encontra a instrução “done” ao fim em uma nova linha ou precedido do caractere “;”.

Solução: Inclua o caractere “;” antes da palavra reservada “done” em instruções de linha única.

Bloco de comandos ausente no loop

Situação: Ao tentar executar o código a seguir na linha de comando:

Erro exibido no terminal: bash: syntax error near unexpected token `done’

Causa do erro: A estrutura de loop “for” não tem o bloco de comandos que será executado.

Solução: Inclua os comandos antes da palavra reservada “done”.

Erros de sintaxe ao criar funções do bash

Para criar uma função do shell bash requer o nome da função seguido por “()” e um bloco de comandos delimitado por chaves “{}”. A seguir será abordado algumas situações que geram o erro de sintaxe em funções do bash.

Falta da “}” para fechar a função

Situação: Ao tentar criar a função dentro de um shell script:

Erro exibido no terminal: syntax error: unexpected end of file

Causa do erro: A função não é fechada com o caractere “}” ao fim, e como todo o código está na mesma linha, também é necessário incluir o “;” após o último comando.

Solução: Feche o bloco de comandos incluindo ao fim o caractere “}”, e se os comandos estiverem na mesma linha adicione ao fim do último comando o caractere “;” (ponto e vírgula).

Ausência da “)” ao declarar a função

Situação: Ao tentar declarar a função executando o código:

Erro exibido no terminal: syntax error near unexpected token `{‘

Causa do erro: O bash lê o código e ao perceber que a função não tem o fechamento dos “()parênteses, ele identifica que o token “{” é inesperado, porque eram esperados os parênteses.

Solução: Feche os parênteses após o nome da função.

Como identificar erros de sintaxe sem executar o shell script ?

Você pode executar o comando bash com a opção “-n” seguido do arquivo de shell script, exemplo:

A opção “-n” faz com que o interpretador leia todo o arquivo para validar a sintaxe sem executar nenhum comando.

Outra forma é executando o comando “shellcheck”, por padrão ele não vêm instalado, para instalar o ShellCheck em distribuições da família Debian/Ubuntu, utilize os comandos:

Para realizar a instalação em distribuições Red Hat, CentOS, AlmaLinux, Rocky Linux ou derivadas, utilize a ferramenta DNF ativando o repositório EPEL:

Após instalado, basta rodar shellcheck seguido do nome do arquivo de shell script, exemplo:

Assim você consegue receber mais detalhes do erro, incluindo recomendações para corrigir o problema, tornando seu processo de desenvolvimento muito mais rápido.

Conclusão

Compreender a origem do erro syntax error near unexpected token é fundamental para desenvolver shell scripts no linux e saber resolver erros na linha de comando.

Ao alinhar a sintaxe correta com delimitadores adequados, você elimina as principais falhas em comandos condicionais, laços de repetição e funções.

Recomendo também a leitura do artigo completo sobre o shell bash no linux para você aprofundar seus conhecimentos sobre o bash, é um passo indispensável para usar a linha de comando do linux e criar scripts.

Ficou com alguma dúvida sobre como corrigir esse problema ou tem alguma sugestão para compartilhar ? Deixe seu comentário logo abaixo, responderemos com o maior prazer!

Perguntas Frequentes (FAQ) sobre o Erro “syntax error near unexpected token” no Bash

Por que o ponto e vírgula (;) é tão importante antes de palavras como “then” e “do” ?

O ponto e vírgula atua como um separador de comandos quando eles são escritos na mesma linha. Ele sinaliza ao Bash o fim da instrução anterior, fazendo com que a palavra seguinte (como `then` ou `do`) seja interpretada como se estivesse no início de uma nova linha.

O que fazer ao receber a mensagem “syntax error: unexpected end of file” ?

Valide o código com o comando “bash -n” ou “shellcheck” para encontrar a partir de qual linha o shell bash identificou a inconsistência no código, e em seguida verifique toda a sintaxe para encontrar onde é gerado o erro.

Por que esquecer a palavra reservada “esac” ao fim da instrução “case” gera erro ?

Porque essa palavra (esac) encerra blocos condicionais na estrutura “case” no shell bash. Na prática, se um bloco não for finalizado corretamente, o bash continua esperando seu fechamento.

Quando encontra outro comando que não faz sentido naquele contexto, ele exibe a mensagem “syntax error near unexpected token”, indicando o primeiro elemento inesperado encontrado.

O número da linha onde o bash encontrou o erro “syntax error near unexpected token” é exibido ?

Não. O Bash normalmente aponta o local onde percebe que a sintaxe ficou inconsistente, e não necessariamente onde o erro foi cometido.

Por exemplo, esquecer um “then” pode fazer o bash acusar erro apenas quando encontrar o próximo “fi”.

Navegue por tópicos:

Foto de Edson Oliveira
Edson Oliveira

Especialista em Linux, trabalhando com TI tem experiência no gerenciamento, solução de problemas e suporte de servidores linux em ambientes corporativos.

Professor de cursos voltados a linux, tecnologias open source e certificações LPI. Possui as certificações LPIC-1, LPIC-2 e LPIC-3 (Mixed Environment).

Navegue por tópicos:

Você também pode gostar:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Valorizamos sua privacidade

Utilizamos cookies para aprimorar sua experiência de navegação, exibir anúncios ou conteúdo personalizado e analisar nosso tráfego. Ao clicar no botão “Aceitar todos”, você concorda com nosso uso de cookies.

Para mais informações leia nossa Política de Privacidade.