Ich folge dieser Bash-Shell-Skriptanleitung:
Im Abschnitt Numerische Vergleiche wird ein Beispiel angeführt:
anny > num=`wc -l work.txt`
anny > echo $num
201
anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi
Was oben zu passieren scheint, ist, dass wir eine Folge von Befehlen in einer Bash-Variablen speichern und dann das Echo für die Variable aufrufen. Was zu passieren scheint, ist, dass die Zeichenfolge ausgewertet und der Befehl wc ausgeführt wird und die Zeilenanzahl an das steuernde Terminal zurückgibt.
Ok, also starte ich mein Terminal in Ubuntu 12.04 und versuche etwas Ähnliches:
$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt
Warten Sie eine Sekunde, die die Zeichenfolge nicht ausgewertet hat, und geben Sie die Zeilenanzahl zurück. Das hat die Zeichenfolge nur zum Terminal zurückgesendet. Warum habe ich unterschiedliche Ergebnisse erzielt?
command-line
bash
scripts
John Merlino
quelle
quelle
wc -l work.txt
, sondern die Nummer 201.Antworten:
Sie müssen Backticks verwenden, um den Ausdruck auszuwerten.
Wenn Sie nur "1" in der Ausgabe sehen möchten, verwenden Sie den Befehl
Und funktioniert auch:
Weitere Informationen finden Sie unter Unterschiede zwischen Doppelzitaten, Einzelzitaten und Backticks in der Befehlszeile.
quelle
wc
Befehl. Versuchen Sie escat sample.txt | wc -l
.Bitte beachten Sie dieses Symbol:
Einfaches Zitat
und
Backquote
Das Backquote gibt also das Ergebnis des Befehls an die Standardausgabe zurück. Deswegen
Gibt die Ergebnisse des Befehls zurück, während
Geben Sie einfach "wc -l sample.txt" wie gewohnt zurück
Betrachten Sie dies als Beispiel:
Und jetzt alle drei Variablen wiedergeben:
quelle
Wenn Sie die Ausgabe eines Befehls in einer Variablen erfassen möchten, müssen Sie entweder Backticks verwenden
``
oder den Befehl in Folgendes einschließen$()
:Beachten Sie, dass die Zeichenfolge zum Zeitpunkt der Variablendeklaration tatsächlich ausgewertet wird und nicht, wenn Sie sie wiedergeben. Der Befehl wird tatsächlich innerhalb der
$()
oder Backticks ausgeführt und die Ausgabe dieses Befehls wird als Wert der Variablen gespeichert.Im Allgemeinen sollten Sie immer
$()
anstelle von Backticks verwenden, die veraltet sind und nur aus Kompatibilitätsgründen und viel eingeschränkter vorhanden sind. Sie können beispielsweise keine Befehle in Backticks verschachteln, aber Sie können mit$()
:In diesem Thread zu U & L finden Sie weitere Informationen dazu, warum
``
dies vermieden werden sollte.quelle
$(
)
zu`
`
. Aber wie wag sagt , einfache Anführungszeichen tun Nest.echo $(date -d $(echo yesterday))
wirdecho `date -d \`echo yesterday\``
;echo $(echo $(date -d $(echo yesterday)))
wirdecho `echo \`date -d \\\`echo yesterday\\\`\``
. Ich sage, dies widerlegt Ihre These nicht, sondern stärkt sie : Entkommene interne Backquotes machen die`
`
Syntax leistungsfähiger als oft zugegeben, aber eine spezielle Behandlung von\
ist seltsam, überraschend und schwer zu begründen. Mit dem,$(
)
was Sie sehen, bekommen Sie normalerweise.