Вопрос:

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

bash command while-loop

108220 просмотра

6 ответа

5915 Репутация автора

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

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

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

Автор: J V Источник Размещён: 11.03.2011 02:41

Ответы (6)


81 плюса

320203 Репутация автора

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

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

С вашей кавычкой версии, вы сравниваете вывод PASSWD, которая бы такие вещи , как Enter passwordи confirm passwordи тому подобное.

Автор: Marc B Размещён: 11.03.2011 02:44

5 плюса

20649 Репутация автора

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

while true
do
  read -p "Enter password" passwd
  case "$passwd" in
    <some good condition> ) break;;
  esac
done
Автор: kurumi Размещён: 11.03.2011 02:48

346 плюса

70429 Репутация автора

Решение
until passwd
do
  echo "Try again"
done
Автор: Erik Размещён: 11.03.2011 02:48

55 плюса

6491 Репутация автора

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

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

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

Автор: duckworthd Размещён: 16.07.2014 01:48

4 плюса

80 Репутация автора

while [ -n $(passwd) ]; do
        echo "Try again";
done;
Автор: Andrés Rivas Размещён: 09.12.2016 09:13

0 плюса

1303 Репутация автора

Если кто-то хочет ограничить количество попыток:

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
Автор: aclokay Размещён: 11.08.2019 08:15
Вопросы из категории :
32x32