Ich habe ein Skript und möchte den Benutzer um einige Informationen bitten. Das Skript kann erst fortgesetzt werden, wenn der Benutzer diese Informationen eingibt. Das Folgende ist mein Versuch, einen Befehl in eine Schleife zu setzen, um dies zu erreichen, aber es funktioniert aus irgendeinem Grund nicht.
echo "Please change password"
while passwd
do
echo "Try again"
done
Ich habe viele Variationen der while-Schleife ausprobiert:
while `passwd`
while [[ "`passwd`" -gt 0 ]]
while [ `passwd` -ne 0 ]]
# ... And much more
Aber ich kann es nicht zum Laufen bringen.
until passwd; do echo "Try again"; sleep 2; done
- Alles, was Sie tun müssen, ist Ctr-C direkt nach (innerhalb der angegebenen zwei Sekunden) zu drücken, nachdemecho
es seine Arbeit erledigt hat.until passwd || (( count++ >= 5 )); do echo "foo"; done
(nur Bash, stellen Sie sicher, dass die Anzahl auf 0 gesetzt wird, wenn diese Variable existiert). Wenn Sie dies für einfaches sh benötigen, erhöhen Sie den Zähler im Körper und verwenden Sie []Sie müssen
$?
stattdessen testen , was der Exit-Status des vorherigen Befehls ist.passwd
Beendet mit 0, wenn alles in Ordnung war, und ungleich Null, wenn die passwd-Änderung fehlgeschlagen ist (falsches Passwort, Passwort-Nichtübereinstimmung usw.)Mit Ihrer Graviszeichen Version, sind Sie passwd die Ausgabe zu vergleichen, das Zeug wäre wie
Enter password
undconfirm password
und dergleichen.quelle
$?
?passwd
mit ändern,/bin/false
wenn Sie einen langen und komplizierten Befehl haben, von dem Sie nicht zwei Versionen behalten möchten.Um auf die Antwort von @Marc B einzugehen,
Ist eine gute Möglichkeit, dasselbe zu tun, was nicht befehlsspezifisch ist.
quelle
sudo
vor einem Befehl zu schreiben , können Sie einfachsudo !!
den vorherigen Befehl mit Root-Rechten ausführen.Sie können eine Endlosschleife verwenden, um dies zu erreichen:
quelle
&& break
nach meinem Überprüfungsbefehl anstelle des Auswahlfalls getan .Wenn jemand ein Wiederholungslimit haben möchte:
quelle
until $(command)
ist grundsätzlich immer falsch. Verwenden Sieuntil command
stattdessen. Dies$(...)
bewirkt, dass die Ausgabe voncommand
selbst als Befehl ausgeführt wird und der Exit-Status dieses sekundären Befehls dem entspricht , auf dem die Schleife ausgeführt wird oder fehlschlägt. Nur wenn kein Standard vorhanden ist , wird der Exit-Status des Befehls selbst berücksichtigt, wenn die Befehlsersetzung vorhanden ist.$command
ist auch kein guter Platzhalter - siehe BashFAQ # 50, warum die Verwendung von Zeichenfolgen zum Speichern von Befehlen von Natur aus unzuverlässig ist. Trotzdem ist das besser als es war; Gegenstimme zurückgezogen.quelle