Ich probiere den Befehl aus
$ b=5; echo `$b`;
-bash: 5: command not found
Aber es wird nicht 5 gedruckt, wie es soll. Was vermisse ich hier?
Was bedeutet `(backquote / backtick) in Befehlen? scheint zu sagen, dass `
die Befehle ausgewertet und durch die Ausgabe ersetzt werden.
bash
shell
command-substitution
coolcric
quelle
quelle
Antworten:
Text zwischen Backticks wird ausgeführt und durch die Ausgabe des Befehls ersetzt (abzüglich der nachgestellten Zeilenumbrüche, und achten Sie darauf, dass das Shell-Verhalten variiert, wenn die Ausgabe NUL-Zeichen enthält). Dies wird als Befehlsersetzung bezeichnet, da sie durch die Ausgabe des Befehls ersetzt wird. Wenn Sie also 5 drucken möchten, können Sie keine Backticks verwenden, Sie können Anführungszeichen verwenden, wie ein
echo "$b"
beliebiges Zitat , oder Sie können es einfach löschen und verwendenecho $b
.Wie Sie sehen,
$b
schlägtbash
die Ausführung des Befehls bei Verwendung von Backticks5
mit der Fehlermeldung fehl, da der Befehl 5 enthält .Um zu verstehen, wie Backticks funktionieren, versuchen Sie Folgendes:
cat /etc/passwd |head -n1
sollte die erste Zeile der/etc/passwd
Datei drucken . Da wir jedoch Backticks verwenden, wird dies nicht auf der Konsole gedruckt. Stattdessen wird es inA
Variable gespeichert . Das können Sie bestätigen$A
. Beachten Sie, dass eine effizientere Methode zum Drucken der ersten Zeile der Befehl ist,head -n1 /etc/passwd
aber ich möchte darauf hinweisen, dass der Ausdruck in Backticks nicht einfach sein muss.Wenn also die erste Zeile von / etc / passwd ist
root:x:0:0:root:/root:/bin/bash
, wird der erste Befehl dynamisch durch bash to ersetztA="root:x:0:0:root:/root:/bin/bash"
.Beachten Sie, dass diese Syntax der Bourne-Shell entspricht. Zitieren und Entkommen wird schnell zum Albtraum, besonders wenn Sie anfangen, sie zu nisten. Ksh stellte die
$(...)
Alternative vor, die jetzt standardisiert ist ( POSIX ) und von allen Shells unterstützt wird (sogar die Bourne-Shell von Unix v9). Daher sollten Sie$(...)
heutzutage stattdessen verwenden, es sei denn, Sie müssen für sehr alte Bourne-Muscheln tragbar sein.Beachten Sie auch, dass die Ausgabe von
`...`
und$(...)
der Wortteilung und der Generierung von Dateinamen genau wie die Variablenerweiterung (in zsh nur Wortteilung) unterliegen und daher im Allgemeinen in Listenkontexten angegeben werden müssten.quelle
you can use quotation marks, like echo "$b"
=> macht der "" etwas besonderes? Es scheint, alsecho $b
würde es genauso gut funktionieren.echo
Befehl sich nicht um die Anzahl der Argumente kümmert. Wenn erb
also Leerzeichen enthält, werden mehrere Argumente abgerufen und trotzdem gedruckt. Dies ist bei anderen Befehlen möglicherweise nicht der Fall (insbesondere, wenn die Variable nicht gesetzt ist), daher tendiere ich dazu, Variablen immer in Anführungszeichen zu setzen.(POSIX)
ein link zum eigentlichen standard wäre.Der Backtick macht genau das, was Sie sagen. Sie haben eine Variable auf eine Ganzzahl gesetzt. Wenn Sie diese Variable in Backticks einfügen, versucht bash, sie als Befehl auszuführen. Da es sich nicht um einen Befehl handelt, erhalten Sie den Fehler, den Sie gesehen haben.
Was Sie tun möchten, ist einfach:
Um Backticks besser zu verstehen, vergleichen Sie mit:
quelle
Wenn Sie Schritt für Schritt vorgehen, sollte dies in Ihrer Zeile erklärt werden.
b
auf 5$b
(läuft effektiv5
)echo
Dies ist die Ausgabe der obigen Auswertung.Also ja, die Ausgabe, die Sie erhalten haben, wird erwartet. Sie bewerten den Inhalt einer Variablen und nicht den tatsächlichen Befehl, von dem Sie dachten, er sei. Alles, was Sie in Backticks einfügen, wird simplay in einer neuen (Sub-) Shell ausgewertet (ausgeführt).
quelle