Ich habe vor ein paar Tagen angefangen, Bash zu lernen.
Ich versuche, einen Exit-Status des grep
Ausdrucks in eine Variable wie folgt zu erhalten :
check=grep -ci 'text' file.sh
und die Ausgabe, die ich bekam, ist
No command '-ic' found
Soll ich das mit einem Pipe-Befehl machen?
bash
shell
command-line
grep
exit-status
Omri Gilhar
quelle
quelle
$?
direkt nach Beendigung des Befehls überprüfen .Antworten:
Ihr Befehl,
wird von der Shell als "den Befehl
-ci
mit den Argumententext
und ausführenfile.sh
und die Variablecheck
auf den Wertgrep
in ihrer Umgebung setzen" interpretiert .Die Shell speichert den Exit-Wert des zuletzt ausgeführten Befehls in der Variablen
?
. Sie können den Wert einer Ihrer eigenen Variablen wie folgt zuweisen:Wenn Sie auf diesen Wert reagieren möchten, können Sie entweder Ihre
check
Variable verwenden:oder Sie können mit einer separaten Variablen überspringen und müssen
$?
alles zusammen überprüfen :(Beachten Sie
-q
, dass es anweistgrep
, nichts auszugeben und zu beenden, sobald etwas übereinstimmt; wir sind nicht wirklich daran interessiert, welche Übereinstimmungen hier vorhanden sind.)Oder wenn Sie nur "Dinge tun" möchten, wenn das Muster nicht gefunden wird:
Das Speichern
$?
in eine andere Variable ist nur dann erforderlich, wenn Sie diese später verwenden müssen, wenn der Wert in$?
wie in überschrieben wurdeIm obigen Code-Snippet
$?
wird durch das Ergebnis des[ "$err" -ne 0 ] && [ ! -d "$dir" ]
Tests überschrieben . Das Speichern hier ist nur dann wirklich notwendig, wenn wir es anzeigen und mit verwenden müssenexit
.quelle
Ihre Frage ist unklar, aber basierend auf dem von Ihnen übermittelten Code soll die Variable
check
den Beendigungsstatus desgrep
Befehls speichern . Der Weg, dies zu tun, ist zu laufenWenn Sie einen Befehl in einer Shell ausführen, wird der Beendigungsstatus über den speziellen Shell-Parameter verfügbar gemacht
$?
.Dies wird von POSIX (dem Standard für Unix-ähnliche Betriebssysteme) in seiner Spezifikation für die Shell dokumentiert, und die Bash-Implementierung wird unter Special Parameters dokumentiert .
Da Sie ein neuer Lerner sind, empfehle ich Ihnen dringend, mit einem guten Buch und / oder einem Online-Tutorial zu beginnen, um die Grundlagen zu erlernen. Empfehlungen für externe Ressourcen werden auf Stack Exchange-Sites nicht empfohlen, ich empfehle jedoch Lhunath und GreyCats Bash Guide .
quelle
Sie haben bash angewiesen, die Variable
check=grep
in der Umgebung festzulegen, die an den Befehl übergeben wirdexistiert aber
ci
nicht.Ich glaube, Sie wollten diesen Befehl in Back-Ticks oder in Klammern, denen ein Dollarzeichen vorangestellt ist, einschließen. In beiden Fällen wird die Anzahl der Zeilen angegeben, in denen "Text" (ohne Berücksichtigung der Groß- / Kleinschreibung) in der Datei gefunden wurde:
Jetzt
$check
sollte 0 sein, wenn keine Übereinstimmungen vorliegen, oder positiv, wenn Übereinstimmungen vorliegen.quelle
Verwirrt, warum -c verwendet wird, wenn die Ausgabe überprüft wird? Es wird verwendet, um zu überprüfen, wie oft etwas übereinstimmt - nicht, ob es erfolgreich ist oder nicht.
aber in diesem Beispiel
Es wird nur ein Exit-Code ausgegeben, der dann wiedergegeben wird. Dies ist die Ausgabe, die die Variablenprüfung verwendet. Ich bevorzuge es auch, weil es eine einzelne Zeile ist.
Sie können --silent durch -q ersetzen. Ich benutze es, da Sie nicht an der grep-Ausgabe interessiert sind, nur ob es funktioniert hat oder nicht.
quelle
Die korrekte Methode, um die Ausgabe des Befehls grep einer Variablen zuzuweisen, lautet wie folgt:
Um den Exit-Status dieses Befehls einer Variablen zuzuweisen, müssen Sie den Shell-Parameter
$?
direkt nach der Ausführung des Befehls verwenden, wie unten gezeigt:quelle