코드를 수정했지만 실행하려고 하면 오류를 찾을 수 없으며 ./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')
이스케이프된 줄바꿈을 참고하세요. 이를 수행하지 않으면 명령 대체에 call dialog
, then 및 Cadastrar
다음이 유틸리티인 것처럼 포함됩니다.Entrar
Sair
이것을 스크립트에 추가하면 bash
4.4를 사용하는 OpenBSD에서 작동하는 것 같습니다.
나와주택 검사현재 보고 있는 오류를 유발하는 구문 오류를 발견할 수 있습니다.
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 문자 제거
누락된 #!
행에 대해서는 질문을 참조하세요.Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?