Как вы можете запустить команду в bash до тех пор, пока успех

У меня есть script и вы хотите спросить у пользователя некоторую информацию, script не может продолжаться до тех пор, пока пользователь не заполнит эту информацию. Ниже приведена моя попытка поместить команду в цикл для достижения этой цели, но по какой-то причине она не работает.

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

Но я не могу заставить его работать.

Ответ 1

until passwd
do
  echo "Try again"
done

Ответ 2

Вместо этого вам нужно проверить $?, что является статусом выхода предыдущей команды. passwd завершает работу с 0, если все работает нормально, и отличное от нуля, если смена пароля была неудачной (неправильный пароль, несоответствие пароля и т.д.)

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

С вашей версией backtick вы сравниваете вывод passwd, который будет выглядеть как Enter password и confirm password и т.д.

Ответ 3

Чтобы уточнить ответ @Marc B,

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

Хороший способ сделать то же самое, что не является специфичным для команды.

Ответ 4

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

Ответ 5

вы можете использовать цикл бесконечности

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

Ответ 6

Попробуйте функцию bash 'read'

echo -n "please confirm to continue (Y/n) "
                read yn
                case $yn in
                        do the rest ;)
                esac