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="$" 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
, который, возможно, неуклюж, но нуждается в меньшем количестве изменений коды.