案例在 bash 上不起作用

案例在 bash 上不起作用

我已经修改了我的代码,但是当我尝试使用它执行时,我找不到任何错误,./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,就好像它们是实用程序一样。EntrarSair

如果我将这些添加到您的脚本中,它似乎对我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 的脚本?

相关内容