我已经修改了我的代码,但是我没有发现任何错误,当我尝试使用它执行时./client.sh
会输出以下错误:
./client.sh: line 111: syntax error near unexpected token `done'
这是我的脚本:
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
除了
#!/bin/bash
第一行的缺失之外,我可以在这个脚本中发现的唯一值得修复的是dialog
顶部的命令替换:这应该是
注意转义的换行符。如果不这样做,命令替换将涉及调用
dialog
, then和Cadastrar
,就好像它们是实用程序一样。Entrar
Sair
bash
如果我将这些添加到您的脚本中,那么在 OpenBSD 上使用 4.4似乎对我有用。我和ShellCheck都无法发现会触发您所看到的错误的语法错误。
ShellCheck 发现我在第一眼看到代码时遗漏的唯一一件事是
可能会更好地写成
同样在代码的另一个地方。
如果脚本文件是在 Windows 机器上编辑的,它可能是一个 DOS 文本文件。在这种情况下,它在每一行的末尾都有一个额外的回车,这很可能导致解释器抱怨语法错误。将您的脚本转换为 DOS 文本文件并运行它
bash
确实会引发一些语法错误,但是,这些与您报告的并不完全相同。dos2unix
您可以使用该实用程序将该文件转换为 Unix 文本文件。另请参阅问题如何在不修改文件的情况下测试文件是使用 CRLF 还是 LF?并从日志文件中删除 ^M 字符关于缺少的
#!
-line,请参阅哪个 shell 解释器运行没有 shebang 的脚本的问题?