我已经修改了我的代码,但是当我尝试使用它执行时,我找不到任何错误,./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
答案1
除了第一行缺失之外#!/bin/bash
,我在这个脚本中发现的唯一值得修复的地方是dialog
顶部的命令替换:
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')
这大概应该是
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')
注意转义的换行符。如果不这样做,命令替换将涉及调用dialog
、 then和Cadastrar
,就好像它们是实用程序一样。Entrar
Sair
如果我将这些添加到您的脚本中,它似乎对我bash
在 OpenBSD 上使用 4.4 有效。
我和外壳检查可以发现会触发您所看到的错误的语法错误。
ShellCheck 发现我第一眼看到代码时错过的唯一一件事是
echo $cadastrar_usuario","$cadastrar_senha",cadastro"
可能会更好地写成
printf '%s,%s,cadastro\n' "$cadastrar_usuario" "$cadastrar_senha"
代码中的另一处也类似。
如果脚本文件已在 Windows 计算机上编辑过,则它可能是 DOS 文本文件。在这种情况下,它在每行末尾都有一个额外的回车符,这很可能导致解释器抱怨语法错误。将脚本转换为 DOS 文本文件并运行bash
做引发一些语法错误,但是,这些错误与您报告的错误并不完全相同。
您可以使用该实用程序将该文件转换为 Unix 文本文件dos2unix
。另请参阅问题如何在不修改文件的情况下测试文件是否使用CRLF或LF?和从日志文件中删除 ^M 字符
关于缺失的#!
行,请参阅问题哪个 shell 解释器运行不带 shebang 的脚本?