Já revisei meu código, mas não consegui encontrar nada de errado, quando tento executar com ./client.sh
ele dá o seguinte erro:
./client.sh: line 111: syntax error near unexpected token `done'
Aqui está o meu roteiro:
while :
do
clear
menu_inicial=$(dialog --stdout --title 'Menu inicial' --menu 'Escolha uma opção:' 0 0 0
Cadastrar 'Cria um novo usuário'
Entrar 'Fazer login com sua conta'
Sair 'Encerra o SEPA')
# Caso o usuário selecione Cancelar, a execução do script será encerrada
if [ $? = 1 ]; then
if [ -f resposta_servidor ] && [ -f dados_digitados ]; then
rm resposta_servidor dados_digitados
clear
exit
else
clear
exit
fi
fi
# THE PROBLEM IS ON THIS CASE
case "$menu_inicial" in
"Entrar") ##### LOGIN #####
while :
do
clear
# Dialog para digitar o nome de usuário
login_usuario=$(dialog --title 'Entrar' --stdout --inputbox 'Digite seu nome de usuário:' 0 0)
# Caso o usuário selecione Cancelar, a execução do script será encerrada
if [ $? = 1 ]; then
break; # Retorna ao menu inicial
# Caso o nome de usuário nao for digitado, o usuário será alertado
elif [ "$login_usuario" = '' ]; then
dialog --stdout --msgbox 'Digite o nome de usuário!' 0 0
break;
fi
# Dialog para digitar a senha
login_senha=$(dialog --title 'Entrar' --stdout --passwordbox 'Digite sua senha:' 0 0)
# Caso o usuário selecione Cancelar, a execução do script será encerrada
if [ $? = 1 ]; then
break; # Retorna ao menu inicial
# Caso a senha não for digitada, o usuário será alertado
elif [ "$login_senha" = '' ]; then
dialog --stdout --msgbox 'Digite a senha!' 0 0
break;
fi
echo $login_usuario","$login_senha",login" > /dev/tcp/127.0.0.1/5678; # Envia os dados digitados pelo usuário para o servidor
nc -l -p 8765 > resposta_servidor # Abre a porta 8765 no cliente para receber a resposta do servidor
# Caso o nome de usuário de a senha estejam corretos, o login é feito
if grep -qw "LOGIN_SUCESSO" resposta_servidor
then
dialog --stdout --msgbox 'Conectado com sucesso!' 0 0
break;
# Caso o nome de usuário ou a senha estejam incorretos, uma mensagem de erro é mostrada
elif grep -qw "LOGIN_ERRO" resposta_servidor
then
dialog --stdout --msgbox 'Senha incorreta, tente novamente!' 0 0
fi
done ##### END LOGIN #####
;;
"Cadastrar") ##### REGISTER #####
while :
do
clear
# Dialog para digitar o nome de usuário
cadastrar_usuario=$(dialog --title 'Cadastrar' --stdout --inputbox 'Digite seu nome de usuário:' 0 0)
# Caso o usuário selecione Cancelar, a execução do script será encerrada
if [ $? = 1 ]; then
break; # Retorna ao menu inicial
# Caso o nome de usuário nao for digitado, o usuário será alertado
elif [ "$cadastrar_usuario" = '' ]; then
dialog --stdout --msgbox 'Digite o nome de usuário!' 0 0
break;
fi
# Dialog para digitar a senha
cadastrar_senha=$(dialog --title 'Cadastrar' --stdout --passwordbox 'Digite sua senha:' 0 0)
# Caso o usuário selecione Cancelar, a execução do script será encerrada
if [ $? = 1 ]; then
break; # Retorna ao menu inicial
# Caso a senha não for digitada, o usuário será alertado
elif [ "$cadastrar_senha" = '' ]; then
dialog --stdout --msgbox 'Digite a senha!' 0 0
break;
fi
echo $cadastrar_usuario","$cadastrar_senha",cadastro" > /dev/tcp/127.0.0.1/5678; # Envia os dados digitados pelo usuário para o servidor
nc -l -p 8765 > resposta_servidor # Abre a porta 8765 no cliente para receber a resposta do servidor
# Caso o nome de usuário de a senha estejam definidos, o cadastro é feito
if grep -qw "CADASTRO_SUCESSO" resposta_servidor
then
dialog --stdout --msgbox 'Cadastrado com sucesso!' 0 0
break;
# Caso ocorra algum erro durante o cadastro, uma mensagem de erro é mostrada
elif grep -qw "CADASTRO_ERRO" resposta_servidor
then
dialog --stdout --msgbox 'Erro no cadastro, tente novamente!' 0 0
fi
done ##### END REGISTER #####
;;
esac
done
Além de uma falta
#!/bin/bash
na primeira linha, a única coisa que posso identificar neste script que valeria a pena consertar é a substituição do comandodialog
no topo:Isso provavelmente deve ser
Observe as novas linhas com escape. Sem fazer isso, a substituição do comando envolverá chamar
dialog
, depoisCadastrar
,Entrar
eSair
como se fossem utilitários.Se eu adicioná-los ao seu script, parece funcionar para mim usando
bash
4.4 no OpenBSD.Nem eu nem o ShellCheck podemos detectar um erro de sintaxe que acionaria o erro que você está vendo.
A única coisa que o ShellCheck descobre que perdi à primeira vista no código é que
provavelmente seria melhor escrito como
E da mesma forma em outro lugar no código.
Se o arquivo de script foi editado em uma máquina Windows, pode ser que seja um arquivo de texto do DOS. Nesse caso, há um retorno de carro extra no final de cada linha, o que pode muito bem fazer com que o interpretador reclame sobre erros de sintaxe. Transformar seu script em um arquivo de texto DOS e executá-lo
bash
provoca alguns erros de sintaxe, no entanto, eles não são exatamente os mesmos que você está relatando.Você pode converter o arquivo em um arquivo de texto Unix usando o
dos2unix
utilitário. Veja também as questões Como testar se um arquivo usa CRLF ou LF sem modificá-lo? e remova o caractere ^M dos arquivos de logEm relação à linha ausente
#!
, consulte a pergunta Qual interpretador de shell executa um script sem shebang?