2016-04-07 22 views
1

Ich versuche, eine Weile Schleife zu machen. Diese Schleife sollte entweder "try again" oder "exit to quit" wiederholen, wenn Sie "gibberish" eingeben oder einen Benutzer finger drücken, wenn Sie den Benutzernamen eingegeben haben.Bash While-Schleife

echo Please enter a user name to find. 
read username 
done_fn() 
{ 
    finger $username 
    exit 0 
}  
continue_fn() 
{ 
    echo 'try again or type exit to quit' 
    read exitvar 
} 

grep $username /etc/passwd >/dev/null 
while [ $? -eq 0 ] 
do 
    done_fn 
done 

exitvar=quit 

until [ $exitvar = exit ] 
do 
    continue_fn 
    done 
while [ -u $exitvar ] 
do 
    done_fn 
done 

Das ist alles, was ich bisher habe. Immer wenn ich einen Benutzernamen nach 'try again' oder 'exit to quit' eintippe, wird es einfach erneut gesendet. Ich möchte, dass der Benutzer gefühlt wird, anstatt es erneut zu wiederholen. Ich habe an so vielen Orten gesucht und kann die Antwort nicht finden.

Vielen Dank im Voraus.

+0

Können Sie die Ausgabe teilen, die Sie bekommen? Um das falsche Verhalten zu zeigen? –

+1

Erfahren Sie, wie Sie die Shell-Debug/Trace-Funktion verwenden und problematische Zeilen mit 'set -vx' und' set + vx' umgeben, um sie zu deaktivieren. Ihr Code wird angezeigt und anschließend ausgeführt. Zeilen mit + an der Vorderseite zeigen Ihnen, welche Werte für Variablennamen ersetzt wurden. Im Debug-Modus wird die gesamte Quotierung von der Debug/Trace-Funktion auf Single-Quote heruntergefahren. Sie sollten sofort sehen, was Ihr Problem mit 'grep' gefolgt von' while' ist. Viel Glück! – shellter

+0

Sobald ich es ausgeführt habe und einen korrekten Benutzer eintippe, fingert es den Benutzer. Wenn ich Gibberish eintippe, gibt es 'try again' aus oder tippe 'exit to quit'. Sobald ich versuche, einen korrekten Benutzer einzutragen, wird die Ausgabe fortgesetzt. 'try again' oder 'exit to quit' eingeben. ' username_loop.sh Bitte geben Sie einen Benutzernamen ein, um zu finden. jmalley2 Anmelden: jmalley2 Name: Joseph Malley username_loop.sh Bitte geben Sie einen Benutzernamen ein, um zu finden. asdfasdfasfasf versuchen Sie es erneut oder geben Sie exit jmalley2 versuchen Sie es erneut oder geben Sie exit zu verlassen –

Antwort

1

Sie können dies versuchen:

typeset u="John Doe" 
while ! grep -q "^$u:" /etc/passwd 
do 
    echo -n "username? " 
    read u 
    if [[ $u = "q" ]] 
    then 
      exit 
    fi 
done 
finger $u 
+0

Sie beginnen mit einem Namen, den Sie sicher nicht in/etc/passwd finden. Dann, bis Sie den eingegebenen Namen im ersten Feld von/etc/passwd (^ :) finden, fragen Sie immer wieder nach neuen Namen. Wenn Sie endlich einen Namen finden, Finger nur. – Dandorid

+0

Sie können das 'read' in' while' setzen, damit Sie nicht mit einem Sentinel-Wert beginnen müssen. Auch ich denke, der "Finger" sollte in die Schleife gehen. – tripleee

+0

Die Schleife wird verwendet, um einen gültigen Benutzernamen zu finden, nichts mehr. Wenn der Benutzername 'q' ist, dann beenden Sie alles. Wenn ein gültiger Benutzername gefunden wird, führen Sie eine finale 'finger'-Anweisung aus und beenden Sie das Skript. Das 'read' ist bereits in der' while' und der Finger sollte nicht da drin sein, da dies nicht in der ursprünglichen Anfrage liegt. – Dandorid

0
echo Please enter a user name to find. 
read username 
donev2_fn() 
{ 
     finger $exitvar 
     exit 0 
} 
done_fn() 
{ 
     finger $username 
     exit 0 
} 
continue_fn() 
{ 
     echo 'try again or type exit to quit' 
     read exitvar 
     grep $exitvar /etc/passwd >/dev/null 
     if [ $? -eq 0 ] 
       then 
         donev2_fn 
     fi 
} 
grep $username /etc/passwd >/dev/null 
while [ $? -eq 0 ] 
     do 
       done_fn 
done 
exitvar=quit 
until [ $exitvar = exit ] 
     do 
       continue_fn 
done 

ich es herausgefunden. Ich musste eine zusätzliche Funktion einbauen. Danke für die Hilfe.