Mam skrypt i chcę zapytać użytkownika o pewne informacje, skrypt nie może być kontynuowany, dopóki użytkownik nie wypełni tych informacji. Oto moja próba umieszczenia polecenia w pętli, aby to osiągnąć, ale z jakiegoś powodu to nie działa.
echo "Please change password"
while passwd
do
echo "Try again"
done
Próbowałem wielu odmian pętli while:
while `passwd`
while [[ "`passwd`" -gt 0 ]]
while [ `passwd` -ne 0 ]]
# ... And much more
Ale nie mogę sprawić, żeby zadziałało.
until passwd; do echo "Try again"; sleep 2; done
- wszystko co musisz zrobić, to nacisnąć Ctr-C zaraz po (w podanych dwóch sekundach), czyecho
wykonał swoją pracę.until passwd || (( count++ >= 5 )); do echo "foo"; done
(tylko bash, upewnij się, że ustawiłeś count na 0, jeśli ta zmienna istnieje) Jeśli potrzebujesz tego dla zwykłego sh, zwiększ licznik w ciele i użyj []Zamiast tego musisz przetestować
$?
, co stanowi status wyjścia poprzedniego polecenia.passwd
kończy się na 0, jeśli wszystko działało poprawnie, i niezerowym, jeśli zmiana hasła nie powiodła się (nieprawidłowe hasło, niedopasowanie hasła itp.)W swojej wersji backtick porównujesz dane wyjściowe passwd, które byłyby podobne
Enter password
iconfirm password
podobne.źródło
$?
?passwd
ze/bin/false
jeśli masz jakieś długie i skomplikowane polecenia, które nie chcą, aby dwie wersje.Aby rozwinąć odpowiedź na @Marc B,
To dobry sposób na zrobienie tego samego, co nie jest specyficzne dla komendy.
źródło
sudo
przed poleceniem, możesz po prostusudo !!
uruchomić poprzednie polecenie z uprawnieniami administratora.Aby to osiągnąć, możesz użyć nieskończonej pętli:
źródło
&& break
po poleceniu weryfikacji zamiast wyboru przypadku.Jeśli ktoś chce mieć limit ponownych prób:
źródło
until $(command)
jest w zasadzie zawsze źle. Użyjuntil command
zamiast tego.$(...)
Powoduje wyjście zcommand
się sam uruchomić jako polecenie, a stan wyjścia tego polecenia wtórnym być co pętla zdecyduje się uruchomić lub nie na temat; to tylko wtedy, gdy jest nie stdout, że stan wyjścia samego polecenia jest uważany gdy substytucja komenda jest obecny.$command
nie jest też wielkim symbolem zastępczym - zobacz BashFAQ # 50, dlaczego używanie ciągów do przechowywania poleceń jest wewnętrznie zawodne. Mimo to jest to lepsze niż było; wycofano głosowanie.źródło