케이스가 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')

이스케이프된 줄바꿈을 참고하세요. 이를 수행하지 않으면 명령 대체에 call dialog, then 및 Cadastrar다음이 유틸리티인 것처럼 포함됩니다.EntrarSair

이것을 스크립트에 추가하면 bash4.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 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?

관련 정보