So setzen Sie eine variable, um die Ausgabe eines Kommandos in der Bash?
Habe ich ein ziemlich einfaches Skript, das ist so etwas wie die folgenden:
#!/bin/bash
VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'
echo $MOREF
Wenn ich dieses script von der Kommandozeile aus und übergeben Sie die Argumente, die ich erhalte keine Ausgabe. Allerdings, wenn ich die Befehle ausführen, die in den $MOREF
variable, ich bin in der Lage zu bekommen Ausgabe.
Ich würde gerne wissen, wie kann man die Ergebnisse eines Befehls, der ausgeführt werden muss, in einem Skript, speichern es in eine variable und dann ausgeben, dass die variable auf dem Bildschirm?
InformationsquelleAutor der Frage John | 2011-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Neben backticks (
`command`
), die Sie verwenden können$(command)
die finde ich leichter zu Lesen und ermöglicht es, die für den Nestbau.Zitieren (
"
) nicht egal zu bewahren, multi-line-Werte.InformationsquelleAutor der Antwort Andy Lester
Update (2018): der richtige Weg ist
Bist du mit dem falschen Apostroph. Sie müssen
`
nicht'
. Dieses Zeichen nennt sich "backticks" (oder "grave accent").Wie diese:
InformationsquelleAutor der Antwort Ilya Kogan
Wie Sie schon angedeutet, Sie sollten verwenden 'backticks'.
Die alternative vorgeschlagen
$(command)
so gut funktioniert, und es auch einfacher zu Lesen,aber beachten Sie, dass es ist gültig nur mit der bash oder korn-shells (Muscheln aus diesen abgeleitet),
also, wenn Sie Ihre Skripte auch wirklich tragbar auf verschiedene Unix-Systeme, sollten Sie lieber die alten backticks notation.
InformationsquelleAutor der Antwort bitwelder
Kenne ich drei Möglichkeiten:
1) - Funktionen sind geeignet für solche Aufgaben:
Aufrufen, indem Sie sagen:
func
2) Auch andere geeignete Lösung könnte sein, eval:
3) Die Dritte ist die Verwendung von Variablen direkt:
erhalten Sie die Ausgabe der Dritten Lösung, in einem guten Weg:
und auch der böse Weg:
InformationsquelleAutor der Antwort MLSC
Einige bash tricks, die ich verwenden, um Variablen festlegen von Befehlen
2. Bearbeiten 2018-02-12: Hinzufügen von eine Besondere Art und Weise, siehe ganz unten auf dieser!
2018-01-25 Edit: add sample-Funktion (für das Auffüllen von vars über die Auslastung des Laufwerks)
Ersten einfachen alten und kompatible Weise
Meist kompatibel, zweite Möglichkeit
Als Schachteln könnte schwer werden, Klammern implementiert wurde, für diese
Verschachtelte sample:
Lesen, mehr als eine variable (mit bashisms)
Wenn ich will einfach nur Verwendet Wert:
konnte man sehen array variable:
Dann:
Aber ich bevorzuge diese:
1.
read foo
wird nur überspringen header-Zeile (variable$foo
enthält so etwas wieFilesystem 1K-blocks Used Available Use% Mounted on
)Sample-Funktion für das Auffüllen der einige Variablen:
Nota:
declare
Zeile ist nicht erforderlich, nur für die Lesbarkeit.Über
sudo cmd | grep ... | cut ...
(Bitte vermeiden Sie nutzlos
cat
! Dies ist also nur 1 Gabel weniger:Alle Leitungen (
|
) impliziert Gabeln. Wo ein anderer Prozess ausgeführt werden, den Zugriff auf Datenträger, Bibliotheken, Anrufe und so weiter.Also mit
sed
zum Beispiel, begrenzen Teilprozess nur eine Gabel:Und mit bashisms:
Aber für viele Aktionen, meist auf kleine Dateien, bash können Sie den job selbst:
oder
Weiter über variable Aufteilung...
Haben Sie einen Blick auf meine Antwort auf Wie kann ich das aufteilen einer Zeichenkette an Trennzeichen in der Bash?
Alternative: Reduzierung Gabeln durch die Verwendung von hintergrund langzeitaufgaben
2. Bearbeiten 2018-02-12:
Um zu verhindern, dass mehrere Gabeln wie
oder
Und weil
date
undbc
arbeiten konnte Zeile:Könnten wir lange laufen hintergrund-Prozess, um Arbeitsplätze wiederholt, ohne die Initiierung neuer Gabel für jede Anforderung:
(natürlich, FD
5
und6
müssen unbenutzt!)... Von dort aus könnten Sie diesen Prozess durch:In eine Funktion
newConnector
Können Sie fand meine
newConnector
Funktion auf GitHub.Com oder auf meine eigene Website (Nota auf github, es gibt zwei Dateien, die auf meiner Website, Funktion und demo sind zusammengefasst in 1 Datei wich, konnte beschafft werden, für die Verwendung oder laufen, nur für demo)Beispiel:
Die Funktion
myBc
lassen Sie die hintergrund-task mit der einfachen syntax, und für das Datum:Von dort, wenn Sie wollen, um am Ende ein Prozess im hintergrund, Sie müssen nur in der Nähe sein fd:
wich ist nicht erforderlich, da alle fd zu schließen, wenn Haupt-Prozess fertig stellen.
InformationsquelleAutor der Antwort F. Hauri
Einfach nur anders zu sein:
InformationsquelleAutor der Antwort DigitalRoss
Wenn Sie wollen, es zu tun mit multiline/mehrere Mannschaft/en, können Sie dies tun:
Oder:
Beispiel:
Ausgabe:
Mit heredoc Sie vereinfachen die Dinge ziemlich leicht durch das brechen-down Ihrer einzigen langen Zeile code in mehrzeiligen. Ein weiteres Beispiel:
InformationsquelleAutor der Antwort Jahid
Beim setzen einer Variablen sicherstellen, dass Sie KEINE Leerzeichen vor und/oder nach der = Zeichen. Buchstäblich verbrachte eine Stunde versucht herauszufinden, versuchen, alle möglichen Lösungen! Das ist Nicht cool.
Richtig:
Fehl mit Fehler: (stuff: nicht gefunden oder ähnliches)
InformationsquelleAutor der Antwort Emil
Können Sie back-ticks(auch bekannt als Akzent-Gräber) oder
$()
.Wie-
Beide haben die gleiche Wirkung. Aber OUTPUT=$(x+2) ist besser lesbar und die jüngste.
InformationsquelleAutor der Antwort Pratik Patil
Dies ist ein weiterer Weg, gut zu bedienen mit einigen text-Editoren, die nicht in der Lage sind, richtig zu markieren, jeden komplizierten code, den Sie erstellen.
InformationsquelleAutor der Antwort Aquarius Power
Einige finden dies nützlich.
Integer Werte in Variablen-Ersetzung, wo der trick besteht darin, mit
$(())
doppelte Klammern:InformationsquelleAutor der Antwort Gus
Müssen Sie entweder
$(command-here)
oder
Beispiel
InformationsquelleAutor der Antwort Diego Velez
Hier sind zwei weitere Möglichkeiten:
Bitte beachten Sie, dass der Raum sehr wichtig ist, in bash. Also, wenn Sie wollen, dass Ihr Befehl ausgeführt werden soll, verwenden Sie, wie ist, ohne dass mehr Räume.
folgenden weist harshil zu L und dann druckt es
folgenden weist die Ausgabe des Befehls
tr
zu L2.tr
betrieben wird, die auf eine andere variable L1.InformationsquelleAutor der Antwort Harshil