loop (repete) bloco de script até a senha bem sucedida do db (mysql)

0

Eu tenho a seguinte função

function executeMySql() {
  while IFS= read -p "$prompt" -r -s -n 1 char
  do
      if [[ $char == $'
echo -e "Enter your mysql \$root password to create the db"
executeMySql "CREATE DATABASE IF NOT EXISTS Test" "Test db ready"
{
  touch /var/moo.txt
} || {
  # ...
}
' ]]; then break fi if [[ $char == $'7' ]]; then prompt=$'\b \b' password="${password%?}" else prompt='*' password+="$char" fi done mysql -u root -p$password -e "$1" ret=$? if [ $ret = "0" ]; then # Show success message printf "\e[32m\nSUCCESS: $2\n\n" tput sgr0 else echo "Wrong password" fi }

e eu uso isso assim

function executeMySql() {
  while IFS= read -p "$prompt" -r -s -n 1 char
  do
      if [[ $char == $'
echo -e "Enter your mysql \$root password to create the db"
executeMySql "CREATE DATABASE IF NOT EXISTS Test" "Test db ready"
{
  touch /var/moo.txt
} || {
  # ...
}
' ]]; then break fi if [[ $char == $'7' ]]; then prompt=$'\b \b' password="${password%?}" else prompt='*' password+="$char" fi done mysql -u root -p$password -e "$1" ret=$? if [ $ret = "0" ]; then # Show success message printf "\e[32m\nSUCCESS: $2\n\n" tput sgr0 else echo "Wrong password" fi }

Mas se o usuário digitar a senha errada do mysql, ele receberá a mensagem Wrong password eo script continuará, mas o que eu quero é repetir as tentativas de senha do usuário até que seja bem-sucedido e continuar com a execução do script.

Alguma ideia de como conseguir isso?

    
por Jocky Doe 24.09.2018 / 14:36

2 respostas

0

Aqui está a versão de trabalho da função

function executeMySql() {
  local password
  local prompt
  local char
  while IFS= read -p "$prompt" -r -s -n 1 char
  do
      if [[ $char == $'
echo -e "Enter your mysql \$root password to create the db"
while ! executeMySql "CREATE DATABASE IF NOT EXISTS Test" "Test db ready"; do :; done
' ]]; then break elif [[ $char == $'7' ]]; then prompt=$'\b \b' password="${password%?}" else prompt='*' password+="$char" fi done mysql -u root -p$password -e "$1" ret=$? if [ $ret = "0" ]; then # Show success message echo -e "SUCCESS: $2" else echo -e "Wrong password try again" fi return $ret; }

exemplo de uso

function executeMySql() {
  local password
  local prompt
  local char
  while IFS= read -p "$prompt" -r -s -n 1 char
  do
      if [[ $char == $'
echo -e "Enter your mysql \$root password to create the db"
while ! executeMySql "CREATE DATABASE IF NOT EXISTS Test" "Test db ready"; do :; done
' ]]; then break elif [[ $char == $'7' ]]; then prompt=$'\b \b' password="${password%?}" else prompt='*' password+="$char" fi done mysql -u root -p$password -e "$1" ret=$? if [ $ret = "0" ]; then # Show success message echo -e "SUCCESS: $2" else echo -e "Wrong password try again" fi return $ret; }
    
por 25.09.2018 / 16:31
1

A chamada mysql não está dentro de um loop, por isso será chamada apenas uma vez, seja bem-sucedida ou não.

Você pode ter certeza de retornar $ret no final de executeMySql e chamá-lo usando:

while ! executeMySql ...; do :; done

ou você pode modificar executeMySql para que a chamada mysql esteja dentro do loop existente: -

function executeMySql() {
  while IFS= read -p "$prompt" -r -s -n 1 char
  do
      if [[ $char == $'7' ]];  then
          prompt=$'\b \b'
          password="${password%?}"
          continue
      elif [[ $char == $'
while ! executeMySql ...; do :; done
' ]]; then prompt='*' password+="$char" continue fi # Drop through when $char == $'
function executeMySql() {
  while IFS= read -p "$prompt" -r -s -n 1 char
  do
      if [[ $char == $'7' ]];  then
          prompt=$'\b \b'
          password="${password%?}"
          continue
      elif [[ $char == $'%pre%' ]]; then
          prompt='*'
          password+="$char"
          continue
      fi
      # Drop through when $char == $'%pre%'
      mysql -u root -p$password -e "$1"
      ret=$?
      if [ $ret = "0" ]; then
        # Show success message
        printf "\e[32m\nSUCCESS: $2\n\n"
        tput sgr0
        return $ret
      else
          echo "Wrong password"
      fi
  done
}
' mysql -u root -p$password -e "$1" ret=$? if [ $ret = "0" ]; then # Show success message printf "\e[32m\nSUCCESS: $2\n\n" tput sgr0 return $ret else echo "Wrong password" fi done }

Eu verifiquei o código no computador, mas não consigo fazer um teste de código com facilidade, portanto, espero tê-lo modificado corretamente, mas, se não, ele deve ser um guia suficiente para o que é necessário fazer.

Você pode, alternativamente, adicionar um loop de fechamento ret=1; while $ret != 0 ... dentro de executeMySql , que é possivelmente mais desajeitado, mas precisa de menos alterações de código.

    
por 24.09.2018 / 15:28