Schleife (Wiederholung) Skriptblock bis erfolgreiches DB-Passwort (MySQL)

426
Jocky Doe

Ich habe die folgende Funktion

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="$" 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 } 

und ich benutze es so

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

Wenn der Benutzer jedoch ein falsches MySQL-Kennwort eingibt, erhält er eine Wrong passwordNachricht, und das Skript wird fortgesetzt, aber ich möchte die Benutzerkennwortversuche so lange wiederholen, bis es erfolgreich ist, und dann mit der restlichen Skriptausführung fortfahren.

Irgendeine Idee, wie man das erreichen kann?

0

2 Antworten auf die Frage

1
AFH

Der mysqlAnruf befindet sich nicht in einer Schleife, daher wird er nur einmal aufgerufen, unabhängig davon, ob er erfolgreich ist oder nicht.

Sie können entweder sicherstellen, dass Sie $retam Ende von zurückkehren executeMySqlund es mit folgendem Befehl aufrufen:

while ! executeMySql ...; do :; done 

oder Sie können ändern, executeMySqlso dass sich der mysqlAnruf in der vorhandenen Schleife befindet: -

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

Ich habe den Code von Amts wegen geprüft, aber ich kann keinen Codetest durchführen, daher hoffe ich, dass ich ihn richtig geändert habe.

Sie könnten alternativ eine umschließende Schleife hinzufügen, ret=1; while $ret != 0 ...innerhalb executeMySql, die möglicherweise schwerfälliger, ist aber weniger Code - Änderungen benötigt.

Es funktioniert nicht, aber es hat mir tatsächlich geholfen, es 10x zu machen Jocky Doe vor 5 Jahren 0
0
Jocky Doe

Hier ist die Arbeitsversion der Funktion

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="$" 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; } 

Verwendungsbeispiel

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