2017-02-09 4 views
-1

Ich bin sehr neu in Linux. Sechs Wochen um genau zu sein. Jedenfalls arbeite ich an einer Aufgabe, mit der ich anscheinend nirgends hingehe. Ich bin ein Skript zu erstellen, dass bei der Eingabe:Linux-Skripte und wenn elif sonst Aussagen

sh filename.sh "username" 

in der Befehlszeile, es gibt oder zeigt Informationen aus Verzeichnissen /etc/passwd und /etc/group. Ich habe eine Vielzahl von if/elif/else Aussagen vergebens gemacht. Dies ist, wo ich momentan bin. Wenn jemand hier ein gewisses Maß an Orientierung bieten kann, wird es sehr geschätzt. Ich sehe nur nicht, wo ich hier falsch liege.

#! /bin/bash 

VAR1="$(grep bob /etc/passwd && grep bob /etc/group)" 
VAR2="$(grep henry /etc/passwd && grep henry /etc/group)" 

if [$VAR1]; then 
    echo "$VAR1" 
elif [$VAR2]; then 
    echo "$VAR2" 
else 
    echo "The user entered is invalid" 
fi 
exit 0 
+0

Versuchen http://shellcheck.net/, bevor Sie für die menschliche Hilfe bitten. Siehe auch das [Stack Overflow 'bash'-Tag-Wiki] (/ tags/bash/info) # oder eine Liste mit sehr häufigen Fragen. – tripleee

+0

Ich habe für eine Frage wie diese zwei Tage gesucht. Ich vermute, dass meine Suche nicht die richtige Frage gestellt hat. Kannst du mir sagen, wie ich alle Ergebnisse, die ich beim Suchen erhalte, am besten eingrenzen kann? Oder die Überschrift/den Titel, der das Thema zeigt, von dem du sprichst? Ich werde Shellcheck.net und das Bash-Tag-Wiki in der Hoffnung betrachten, es zu finden. Danke für deine Hilfe!. –

+1

@ F.Garvin - Ich habe gerade nach "bash wenn else Statement" gesucht und habe dieses Ergebnis: http://stackoverflow.com/questions/16034749/bash-script-if-elif-else-statement-issues - was sich herausstellt um der Richtige zu sein. Nach was hast du gesucht? – codeforester

Antwort

2

Versuchen Sie folgendes:

#!/bin/bash 

VAR1="$(grep bob /etc/passwd && grep bob /etc/group)" 
VAR2="$(grep henry /etc/passwd && grep henry /etc/group)" 

if [ "$VAR1" ]; then 
    echo "$VAR1" 
elif [ "$VAR2" ]; then 
    echo "$VAR2" 
else 
    echo "The user entered is invalid" 
fi 

Änderungen:

  • Abstand innerhalb conditionals (verpflichtend zwischen Halter und Argumente)
  • innen conditionals Zitiert (schützt vor Wort Splitting)
  • exit 0 am Ende nicht erforderlich
  • Erste Zeile: In der Regel ist kein Abstand nach dem ! verwendet (obwohl kein Fehler)
+0

Die Erfassung von 'grep' Ausgabe in eine Variable, so dass Sie es mit einer leeren Zeichenfolge vergleichen können, ist ein Antipattern. 'grep '^ henry'/etc/passwd && grep '^ henry'/etc/groups; then ... 'wird eine beliebige Übereinstimmung ausgeben und ihren Beendigungscode auf" if "zurückgeben, um die Ablaufsteuerung auf einmal zu ermöglichen. (Verwenden Sie 'grep -q', wenn Sie nicht möchten, dass die Übereinstimmungen gedruckt werden. Beachten Sie das Fehlen von' ['und siehe auch https://stackoverflow.com/questions/36371221/bash-if-statement-too-many-arguments Wenn das dich verblüfft.) – tripleee

+0

Wenn ich den Platz in der Bedingung hinzufüge, wird es richtig angezeigt. Unabhängig vom eingegebenen Benutzernamen wird jedoch die gleiche Ausgabe angezeigt, die mit VAR1 verknüpft ist. Ich habe die Informationen auf den von Ihnen bereitgestellten Seiten gelesen und diese Alternativen ausprobiert, aber das hat nicht funktioniert. Lass mich sehen, ob ich einen Screenshot der Ausgabe posten kann. –

+0

@ F.Garvin Der '[$ VAR1"] 'Test gibt '0' (wahr) zurück, wenn' VAR1' in eine nicht leere Zeichenkette expandiert. Wenn Ihr 'if'-Block immer das Gleiche zurückgibt, liegt das daran, dass diese Variable niemals zu einer leeren Zeichenfolge erweitert wird. Enthält 'VAR1' das, was Sie erwarten? – Fred