コードを修正しましたが、実行しようとするとエラーが見つからず、次の./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なしでスクリプトを実行するシェルインタプリタとは何ですか?