web-dev-qa-db-ja.com

成功するまで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

しかし、私はそれを機能させることができないようです。

193
J V
until passwd
do
  echo "Try again"
done
337
Erik

代わりに$?をテストする必要があります。これは前のコマンドの終了ステータスです。 passwdは、すべてが正常に機能した場合は0で終了し、passwdの変更が失敗した場合(パスワードが間違っている、パスワードが一致しないなど)はゼロ以外で終了します。

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

バックティックバージョンでは、passwdの出力を比較しています。これは、Enter passwordconfirm passwordなどのようなものです。

80
Marc B

@Marc Bの答えを詳しく説明するには、

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

コマンド固有ではない同じことを行う良い方法です。

51
duckworthd

無限ループを使用できます

while true
do
  read -p "Enter password" passwd
  case "$passwd" in
    <some good condition> ) break;;
  esac
done
5
kurumi
while [ -n $(passwd) ]; do
        echo "Try again";
done;
4
Andrés Rivas

再試行制限がある場合:

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
1
aclokay