循环(重复)脚本块直到成功输入 db(mysql)密码

循环(重复)脚本块直到成功输入 db(mysql)密码

我有以下功能

function executeMySql() {
  while IFS= read -p "$prompt" -r -s -n 1 char
  do
      if [[ $char == $'\0' ]]; then
          break
      fi
      if [[ $char == $'\177' ]];  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
}

我这样使用它

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
} || {
  # ...
}

但是如果用户输入了错误的 mysql 密码,他会收到Wrong password消息并且脚本继续,但我想要的是循环用户密码尝试直到成功,然后继续执行其余的脚本。

知道如何实现吗?

答案1

mysql调用不在循环内,因此无论成功与否,都只会调用一次。

您可以确保$ret在末尾返回executeMySql并使用以下命令调用它:

while ! executeMySql ...; do :; done

或者您可以进行修改executeMySql,以便mysql调用在现有循环内:-

function executeMySql() {
  while IFS= read -p "$prompt" -r -s -n 1 char
  do
      if [[ $char == $'\177' ]];  then
          prompt=$'\b \b'
          password="${password%?}"
          continue
      elif [[ $char == $'\0' ]]; then
          prompt='*'
          password+="$char"
          continue
      fi
      # Drop through when $char == $'\0'
      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
}

我已经对代码进行了桌面检查,但我无法轻松地进行代码测试,所以我希望我已经正确地修改了它,尽管如果没有,它应该足以指导需要做什么。

ret=1; while $ret != 0 ...您也可以选择在中添加一个封闭循环executeMySql,这可能比较笨拙,但需要的代码更改较少。

答案2

这是该函数的工作版本

function executeMySql() {
  local password
  local prompt
  local char
  while IFS= read -p "$prompt" -r -s -n 1 char
  do
      if [[ $char == $'\0' ]]; then
          break
      elif [[ $char == $'\177' ]];  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;
}

使用示例

echo -e "Enter your mysql \$root password to create the db"
while ! executeMySql "CREATE DATABASE IF NOT EXISTS Test" "Test db ready"; do :; done

相关内容