如何在bash中一遍又一遍地运行命令直到成功?

我有一个脚本,想向用户询问一些信息,但是脚本不能继续,直到用户填写这些信息。以下是我试图将一个命令放入循环中来实现这一点,但由于某种原因它不起作用:

echo "Please change password"
while passwd
do
echo "Try again"
done

我尝试了很多while循环的变体:

while `passwd`
while [[ "`passwd`" -gt 0 ]]
while [ `passwd` -ne 0 ]]
# ... And much more

但我好像不能让它工作。

192756 次浏览

相反,您需要测试$?,这是前一个命令的退出状态。如果一切正常,passwd退出为0,如果passwd修改失败(密码错误,密码不匹配,等等…)

passwd
while [ $? -ne 0 ]; do
passwd
done

对于你的反刻度版本,你在比较passwd的输出,这将是类似Enter passwordconfirm password之类的东西。

你可以使用一个无限循环来实现这一点:

while true
do
read -p "Enter password" passwd
case "$passwd" in
<some good condition> ) break;;
esac
done
until passwd
do
echo "Try again"
done

while ! passwd
do
echo "Try again"
done

为了详细说明@Marc B的回答,

$ passwd
$ while [ $? -ne 0 ]; do !!; done

是做同样事情的好方法,而且不是特定于命令的。

while [ -n $(passwd) ]; do
echo "Try again";
done;

如果有人想要重试限制:

max_retry=5
counter=0
until $command
do
sleep 1
[[ counter -eq $max_retry ]] && echo "Failed!" && exit 1
echo "Trying again. Try #$counter"
((counter++))
done