ケースが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なしでスクリプトを実行するシェルインタプリタとは何ですか?

おすすめ記事