Unterschied zwischen $ '$ foo' und $ "$ foo"

9

Ich habe Schwierigkeiten, einige Nuancen zwischen einfachen und doppelten Anführungszeichen in einem variablen Kontext herauszufinden

Ich definiere:

foo=pwd

Führen Sie dann diese aus:

echo $'$foo'

Welche Echos $foo(dh das erste $in meinem Echo-Befehl wird gelöscht)

echo $"$foo"

Dieses Echo pwd(was bedeutet, dass die Bash $foo, meine Variable, auf ihren Wert erweitert wird)

echo $`$foo`

Endlich dieses Echo $~/scripts(ich habe erwartet, dass es gedruckt wird ~/scriptsund nicht $~/scripts)

Kann mir jemand helfen, diese Unterschiede herauszufinden?

Ilan
quelle

Antworten:

11

Letztendlich wird der letzte gedruckt, $~/scriptsweil $`foo`es sich um eine Kombination aus einem Literal $und einer Befehlssubstitution handelt. Daher wird das Führende $als Literal $und das Nachfolgende `$foo`als Befehlssubstitution interpretiert .

kos
quelle
Ich habe die Code-Tags entfernt und durch nur `` `` `` `` Zeichen usw. ersetzt. Sie können jederzeit einen Rollback durchführen, wenn Sie die Code-Tags bevorzugen
Tim
@ Tim Danke, ich bin mir nicht sicher, was ich genau getan habe, aber aus irgendeinem Grund erschien der Beitrag nach Ihrer Bearbeitung genauso gestört wie in meiner ersten Revision, also habe ich ihn zurückgesetzt ... Und jetzt sehe ich, dass er in der Revision in Ordnung aussieht. Ich bin mir nicht sicher, was passiert ist. Ich werde dies in der Formatierungs-Sandbox testen, bevor ich zu Ihrer Version zurückkehre, da ich befürchte, dass ich den Beitrag erneut stören könnte. Trotzdem danke für die Mühe.
Kos
Klar, keine Probleme. Meins verwendet Leerzeichen mit der Breite Null. Seien Sie also beim Bearbeiten vorsichtig.
Tim
2

Erster Fall:

echo $'$foo'

Welche Echos $foo(dh das erste $in meinem Echo-Befehl wird gelöscht)

Der erste $wird als Befehl ausgeführt. Echo benötigt keine Leerzeichen zwischen den Argumenten, sondern nur diese.

Echo wird also $'$foo'erweitert, um den Befehl auszuführen $(der kein Befehl ist, also ignoriert er ihn) und dann echo '$foo'. Alles, was aufgenommen ''wird, wird zum Nennwert genommen - es erweitert es nicht oder so. Sie können eingeben, was Sie wollen, und nichts passiert.

Wenn Sie ersetzen die $mit $$ihm Echos der Prozess - ID.


Zweite:

echo $"$foo"

Dieses Echo pwd(was bedeutet, dass die Bash $foo, meine Variable, auf ihren Wert erweitert wird)

Das liegt daran "", dass es sich nicht ausdehnt. ""wird normalerweise verwendet, um sicherzustellen, dass ein Wert zum Vergleichen vorhanden ist.

Wenn Sie eine Variable haben, die leer sein könnte (z. B. grepaufgrund eines Ergebnisses), und Sie sie mit einem anderen Wert / einer anderen Variablen vergleichen möchten, müssen Sie die erste Variable eingeben "". Dies stellt sicher, dass immer ein Vergleich zu überprüfen ist und nicht nur ein leerer Codeabschnitt (wie Bash sieht), der einen Fehler ausgibt.


Schließlich Nummer 3. Das ist interessant.

echo $`$foo`

Dieses Echo $~/scripts(ich habe erwartet, dass es gedruckt wird ~/scriptsund nicht $~/scripts)

Das liegt daran, dass (in diesem Fall) das Echo $zuerst das Zeichen druckt. Wenn Sie etwas in Backticks einfügen, wird der Wert der Variablen als Befehl ausgeführt (in neueren Versionen von bash ist dies besser möglich $(command)).

Also hallt $es zuerst, dann erweitert es sich, ​`$foo`​zu ​`pwd`​dem es ausgeführt wird, und kehrt zurück ~/Scripts. Aber wir hatten den $Druck früher - also ist die gesamte Ausgabe $~/Scripts.

Tim
quelle
Gute Arbeit an einigen sehr schwierigen Formatierungen!
Arronical
1
@Arronical Danke :) Sie können es nicht sehen, aber es gibt einige Leerzeichen mit der Breite Null für den letzten Satz. Die Dinge, die ich für imaginäre Internetpunkte mache ...!
Tim
1
+1 Gute Antwort. Ich möchte nur hinzufügen, dass das Zitieren von Variablen die Standardeinstellung sein sollte, es sei denn, Sie haben einen bestimmten Grund, dies nicht zu tun - nicht nur, um mögliche Nullwerte zu behandeln. Weitere Informationen finden Sie unter unix.stackexchange.com/questions/171346/… , als Sie jemals darüber wissen wollten. ;)
Joe