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 “then” em 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 erro | Possível Causa | Possível Solução |
|---|---|---|
| then | Falta “;” (ponto e vírgula), quebra de linha ou erro na instrução “if”. | Adicione “; then” ou coloque “then” na linha seguinte. |
| do | Falta “;” (ponto e vírgula) ou quebra de linha no “for” ou “while”. | Adicione “; do” ou coloque o “do” na linha seguinte. |
| fi | Bloco “if” incompleto ou ausência da instrução “then”. | Confira se o “if” possui a instrução “then” e comandos válidos. |
| done | Ausência da instrução “do”. | Confira se o laço possui a instrução “do” e comandos válidos. |
| esac | Ausê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:
echo A data atual é: $(dateErro 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.
echo A data atual é: $(date)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”:
ls -l relatorio (1).pdfErro 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.
ls -l "relatorio (1).pdf"
# OU
ls -l relatorio\ \(1\).pdf
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:
echo “Iniciando processo de backup
echo “Encerrando processo de backup”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.
echo “Iniciando processo de backup”
echo “Encerrando processo de backup”Excesso de aspas e não fechamento delas
Situação: Ao declarar uma variável dentro de um shell script como mostrado a seguir:
system='Debian' GNU/Linux'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.
system='Debian GNU/Linux'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:
if [ "$NOME" == "Admin" ] then
echo "Acesso liberado"
fiErro 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.
if [ "$NOME" == "Admin" ] ; then
echo "Acesso liberado"
fiAusência do “fi” no final do bloco
Situação: A seguinte estrutura condicional é executada em um script:
if [ -f "/etc/passwd" ]
then
echo "Arquivo encontrado" fiErro exibido no terminal: syntax error: unexpected end of file

Causa do erro: O bloco foi encerrado sem a palavra reservada “fi” em uma nova linha.
Solução: Fechar corretamente o bloco condicional “if” com “fi”.
if [ -f "/etc/passwd" ]
then
echo "Arquivo encontrado"
fiFechamento incorreto da palavra reservada “else”
Situação: Ao tentar executar na linha de comando o código abaixo:
if [ "$VALOR" -gt 10 ]; then
echo "Maior que dez"
else;
echo "Menor ou igual a dez"
fiErro 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).
if [ "$VALOR" -gt 10 ]; then
echo "Maior que dez"
else
echo "Menor ou igual a dez"
fiPara 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:
case $1 in
[0-9]) echo "é um número"
[a-z]|[A-Z]) echo "é uma letra";;
esacErro 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.
case $1 in
[0-9]) echo "é um número";;
[a-z]|[A-Z]) echo "é uma letra";;
esacAusência da instrução de encerramento “esac”
Situação: Estrutura condicional “case” é executada com o seguinte código:
case "$SERVICO" in
start) systemctl start nginx ;;
stop) systemctl stop nginx ;;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”.
case "$SERVICO" in
start) systemctl start nginx ;;
stop) systemctl stop nginx ;;
esacErros de sintaxe ao executar o comando for
A estrutura de repetição “for” 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:
for users in $(cut -d':' -f1 /etc/passwd) do
echo “usuário: $users cadastrado”
doneErro 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.
for users in $(cut -d':' -f1 /etc/passwd) ; do
echo “usuário: $users cadastrado”
doneInserção do “done” na mesma linha sem o separador “;”
Situação: O loop “for” a seguir está em um script, ao tentar executa-lo:
for arq in *.txt; do echo "Processando $arq" doneErro 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.
for arq in *.txt; do echo "Processando $arq" ; doneBloco de comandos ausente no loop
Situação: Ao tentar executar o código a seguir na linha de comando:
for i in 1 2 3 4 5; do \
#echo "Processando $i" ;\
doneErro 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”.
for i in 1 2 3 4 5; do
echo "Processando $i"
doneErros 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:
funcao1 () { echo “funcao1 executada”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).
funcao1 () { echo “funcao1 executada”; }Ausência da “)” ao declarar a função
Situação: Ao tentar declarar a função executando o código:
funcao2 ( { echo “funcao2 executada” ; )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.
funcao2 () { echo “funcao2 executada” ; ) 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:
bash -n nome_do_script.shA 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:
apt updateapt install shellcheck -yPara realizar a instalação em distribuições Red Hat, CentOS, AlmaLinux, Rocky Linux ou derivadas, utilize a ferramenta DNF ativando o repositório EPEL:
dnf install epel-release -ydnf install shellcheck -yApós instalado, basta rodar shellcheck seguido do nome do arquivo de shell script, exemplo:
shellcheck seu_script.shAssim 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”.

