Welche Bedeutung haben einfache und doppelte Anführungszeichen in Umgebungsvariablen?

19

Ich habe einige Umgebungsvariablen in meinem .profile wie folgt definiert:

MY_HOME="/home/my_user"

Die Variable scheint jedoch nur ausgewertet zu werden, wenn ich die Anführungszeichen entferne und die Datei erneut entpacke. Ich glaube, die Anführungszeichen sind notwendig, wenn Leerzeichen verwendet werden sollen, und einfache Anführungszeichen werden verwendet, wenn Fluchtwege nicht erwünscht sind. Kann jemand die Bedeutung von einfachen und doppelten Anführungszeichen in Variablendefinitionen erläutern? Wie wäre es mit Front-Ticks und Back-Ticks?

2NinerRomeo
quelle

Antworten:

23

Ich denke, Sie sind über Terminologie verwirrt.

Eine "Umgebungsvariable" ist lediglich eine Shell-Variable, die alle untergeordneten Prozesse erben.

In Ihrem Beispiel erstellen Sie eine Shell-Variable. Es ist nicht in der Umgebung, bis Sie es exportieren:

MY_HOME="/home/my_user"
export MY_HOME

Fügt eine Variable mit dem Namen "MY_HOME" in fast alle Shells ein (csh, tcsh ausgenommen).

In diesem speziellen Fall sind die doppelten Anführungszeichen überflüssig. Sie haben keine Wirkung. Durch doppelte Anführungszeichen werden Teilzeichenfolgen gruppiert, aber die von Ihnen verwendete Shell kann die Variablen ersetzen. Durch einfache Anführungszeichen werden Teilzeichenfolgen gruppiert und Substitutionen verhindert. Da Ihre Beispielzuweisung keine Variablen enthält, könnten die doppelten Anführungszeichen als einfache Anführungszeichen erscheinen.

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

Nichts befindet sich in der Umgebung, bis Sie es exportieren.

Bruce Ediger
quelle
18

Shell-Variablen vs. Umgebungsvariablen

MY_HOME="/home/my_user"Legt die aufgerufene Shell-Variable festMY_HOME . Shells sind Programmiersprachen und haben Variablen (auch Parameter genannt). Nach dieser Zuordnung können Sie den Wert der Variablen verwenden, z echo "$MY_HOME". B. mit .

Shell-Variablen sind ein internes Shell-Konzept. Wenn diese Shell-Instanz beendet wird, MY_HOMEwird vergessen. Was jedes Programm kennt und an seine Kinder überträgt, sind Umgebungsvariablen .

Innerhalb der Shell arbeiten Umgebungsvariablen und Shellvariablen auf sehr ähnliche Weise. Tatsächlich werden alle Umgebungsvariablen, die die Shell von ihrem übergeordneten Element übernimmt, zu Shellvariablen. Umgekehrt wird eine in einem Shell-Skript definierte Shell-Variable zu einer Umgebungsvariablen, wenn Sie sie exportieren .

export MY_HOME="/home/my_user"

Weitere Details können Sie bei der ersten Lesung überspringen

Der Grund, warum Shell-Variablen nicht automatisch zu Umgebungsvariablen werden, ist zum einen, dass ein Skript versehentlich einen Variablennamen verwendet, der für ein von ihm gestartetes Programm von Bedeutung ist, und zum anderen, dass es sich nur um historische Variablen handelt.

Einige sehr alte Shells müssen exportjedes Mal verwendet werden, wenn Sie einen Variablennamen ändern. Alle modernen Shells protokollieren jedoch die Zuweisungen für Umgebungsvariablen, sodass das folgende Snippet wiedergegeben wird bar:

myvar=foo
export myvar
myvar=bar
env | grep '^myvar='

Einige sehr alte Shells erforderten separate Befehle für myvar=foound export myvar, aber alle modernen Shells verstehen export myvar=foo.

Sie können ausführen set -a, um alle Shell-Variablenzuweisungen zu veranlassen, die Variable automatisch zu exportieren. Dies myvar=fooentspricht dem Vorgang, export myvar=foowenn Sie set -adiese Shell zuerst ausgeführt haben.

Beim Zitieren

Das Zitieren ist meistens orthogonal. Wenn der Wert, den Sie der Variablen zuweisen, keine Sonderzeichen für die Shell enthält, benötigen Sie keine Anführungszeichen. Wenn es Sonderzeichen gibt, müssen Sie diese mit einfachen oder doppelten Anführungszeichen oder Backslashes oder einer Kombination davon schützen. Dies gilt sowohl für die einfache myvar=valueSyntax als auch für das exportDienstprogramm.

Es gibt einen Unterschied zwischen der Zuweisungssyntax und der exportSyntax. Die Shell erweitert die Ergebnisse von Variablensubstitutionen $fooweiter und führt Feld- (Wort-) Aufteilung und Pfadnamenerweiterung (Globbing) durch . Das heißt, wenn der Wert von myvarist hello ​ *, wird echo $myvargedruckt, hellogefolgt von einem einzelnen Leerzeichen, gefolgt von der Liste der Dateien im aktuellen Verzeichnis. Dies ist fast nie wünschenswert, damit das allgemeine Prinzip immer in doppelte Anführungszeichen Variablenersetzungen verwenden (es sei denn , Sie wissen , dass Sie Expansion oder Feldaufspaltung pathname muss): echo "$myvar". Im Falle einer einfachen Zuweisung wird othervar=$myvarder Wert von myvarto tatsächlich zuverlässig kopiertothervar, weil Globbing und Wortteilung in Zuweisungen unterbunden sind (weil sie mehrere Wörter erzeugen, aber ein einzelnes Wort erwartet wird). Diese Ausnahmeregelung gilt jedoch nicht export. Wenn Sie sich also an eine einfache Regel erinnern möchten, setzen Sie Variablenersetzungen immer in doppelte Anführungszeichen.

Gilles 'SO - hör auf böse zu sein'
quelle
Können Sie mir bitte erklären, dass das Zitieren meistens orthogonal ist? im Abschnitt "Über das Zitieren"? Ich verstehe die Bedeutung von orthogonal in diesem Satz nicht.
Gerechtigkeit für Monica
1
@DKBose Dies bedeutet, dass Umgebungsvariablen und Shell-Variablen einerseits und das Zitieren andererseits zwei separate Probleme sind, die wenig miteinander zu tun haben. Wiktionary Bedeutungen 4 und 5.
Gilles 'SO- aufhören, böse zu sein'