スクリプトがあり、ユーザーに情報を要求したいのですが、ユーザーがこの情報を入力するまでスクリプトを続行できません。以下は、これを実現するためにコマンドをループに入れる試みですが、何らかの理由で機能しません。
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
しかし、私はそれを機能させることができないようです。
until passwd
do
echo "Try again"
done
代わりに$?
をテストする必要があります。これは前のコマンドの終了ステータスです。 passwd
は、すべてが正常に機能した場合は0で終了し、passwdの変更が失敗した場合(パスワードが間違っている、パスワードが一致しないなど)はゼロ以外で終了します。
passwd
while [ $? -ne 0 ]; do
passwd
done
バックティックバージョンでは、passwdの出力を比較しています。これは、Enter password
やconfirm password
などのようなものです。
@Marc Bの答えを詳しく説明するには、
$ passwd
$ while [ $? -ne 0 ]; do !!; done
コマンド固有ではない同じことを行う良い方法です。
無限ループを使用できます
while true
do
read -p "Enter password" passwd
case "$passwd" in
<some good condition> ) break;;
esac
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