Как вы можете запустить команду в Bash до успеха - PullRequest
195 голосов
/ 11 марта 2011

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

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

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

Ответы [ 5 ]

342 голосов
/ 11 марта 2011
until passwd
do
  echo "Try again"
done
80 голосов
/ 11 марта 2011

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

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

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

53 голосов
/ 16 июля 2014

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

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

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

5 голосов
/ 11 марта 2011

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

while true
do
  read -p "Enter password" passwd
  case "$passwd" in
    <some good condition> ) break;;
  esac
done
4 голосов
/ 10 декабря 2016
while [ -n $(passwd) ]; do
        echo "Try again";
done;
...