Caso não esteja funcionando no bash

3

Eu já revisei meu código, mas não consigo encontrar nada de errado, quando tento executar com ./client.sh ele gera o seguinte erro:

./client.sh: line 111: syntax error near unexpected token 'done'

Desculpe pelo código longo:

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
    
por HenriqueHBR 04.02.2018 / 19:04

1 resposta

2

Além de perder #!/bin/bash na primeira linha, a única coisa que eu posso encontrar neste script que valeria a pena ser corrigida é a substituição de comando com dialog no topo:

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')

Isso provavelmente deve ser

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')

Observe as novas linhas com escape. Sem fazer isso, a substituição do comando envolverá a chamada de dialog , em seguida, Cadastrar , Entrar e Sair 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 podem detectar um erro de sintaxe que acionaria o erro que você está vendo.

A única coisa que o ShellCheck descobre que perdi na primeira vista no código é que

echo $cadastrar_usuario","$cadastrar_senha",cadastro"

provavelmente seria melhor escrito como

printf '%s,%s,cadastro\n' "$cadastrar_usuario" "$cadastrar_senha"

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, ele tem um retorno de carro extra no final de cada linha, o que poderia muito bem fazer com que o intérprete se queixasse dos erros de sintaxe. Transformar seu script em um arquivo de texto do DOS e executá-lo com bash faz provocar alguns erros de sintaxe, no entanto, eles não são exatamente iguais aos que você está relatando.

Você pode converter o arquivo em um arquivo de texto Unix usando o utilitário dos2unix . Veja também as perguntas Como testar se um arquivo usa CRLF ou LF sem modificá-lo? e Remover o caractere ^ M dos arquivos de log

Em relação à #! -line ausente, veja a pergunta Qual interpretador de shell executa um script sem shebang?

    
por 04.02.2018 / 19:22