บล็อกสคริปต์วนซ้ำ (ซ้ำ) จนกระทั่งรหัสผ่าน db (mysql) สำเร็จ


0

ฉันมีฟังก์ชั่นดังต่อไปนี้

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ซึ่งอาจเป็นความงมงาย แต่ต้องการการเปลี่ยนแปลงรหัสน้อยลง


มันไม่ทำงาน แต่จริง ๆ แล้วช่วยให้ฉันทำงานได้ 10x
Jocky Doe

0

นี่คือฟังก์ชันเวอร์ชันที่ใช้งานได้

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.