我有以下功能
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