Wenn ich in einem Shell-Skript eine Variable wie z. B. definiere FOO=25
, gibt es einen Unterschied zwischen der Referenzierung als $FOO$
und ${FOO}$
?
command-line
scripts
Karnivaurus
quelle
quelle
$
am Ende nicht benutzen ! Es wird als normales Zeichen und nicht als Teil des Variablennamens behandelt.Antworten:
In den meisten Situationen sind beide
$var
und${var}
gleich. (Beachten Sie, dass Sie$
am Ende kein a verwenden dürfen !)Ein Beispiel, bei dem Sie geschweifte Klammern benötigen, ist, wenn Sie eine Variable in eine fortlaufende Zeichenfolge einfügen müssen.
Beispiel:
wird ausgegeben
hello
.quelle
Zur Beantwortung Ihrer Hauptfrage
${foo}
heißt "Parametererweiterung" . Um genau zu sein,$
startet das selbst die Parametererweiterung, die{ }
gemäß der POSIX-Spezifikation tatsächlich optional sind , aber nützlich sein kann, um das Ende des Variablennamens anzugeben:Grundsätzlich
$foo
und${foo}
sind identisch. Abgesehen von Fällen wie den oben genannten oder wenn Sie eine Zeichenfolgenmanipulation durchführen , sind sie völlig gleichwertig.Sie sollten jedoch keines von beiden wirklich verwenden. Als Faustregel ist , dass mit sehr wenigen Ausnahmen abgesehen, sollten Sie immer verwenden
"$foo"
oder"${foo}"
und nie$foo
oder${foo}
. Sie sollten Ihre Variablen immer in Anführungszeichen setzen, um den Aufruf des Operators split + glob zu vermeiden (dazu später mehr). Das willst du bestimmt nicht$foo$
. Das Finale$
ist irrelevant:Während also nicht zitierte Variablen manchmal in Ordnung sind:
Sie sind in der Regel nicht und sollten wirklich vermieden werden:
Beachten Sie, dass die Klammern auch hier nicht helfen:
Wenn Sie
$foo
oder verwenden${foo}
, teilt die Shell den in der Variablen im Leerzeichen gespeicherten Wert (dies kann geändert werden, indem dieIFS
Variable auf einen anderen Wert gesetzt wird ) in eine Liste auf. Anschließend wird jedes Element der Liste als Glob- Muster behandelt und erweitert alle passenden Dateien oder Verzeichnisse. Dies wird als Split + Glob- Operator bezeichnet. Betrachten Sie zur Veranschaulichung ein Verzeichnis mit zwei Dateien:Setzen wir nun eine Variable auf
foo *
:Was passiert, wenn wir versuchen zu überprüfen, ob eine Datei mit diesem Namen vorhanden ist?
Die Variable wurde in aufgeteilt
foo
und*
da*
es sich um einen Platzhalter handelt, der mit einer beliebigen Zeichenfolge übereinstimmt, teilt Ihnen die Shell mit, dass eine Datei mit dem Namenfoo *
exxists vorhanden ist. Wenn wir es jedoch richtig zitieren, passiert dies nicht:Das war ein triviales Beispiel, um den Punkt zu veranschaulichen. Stellen Sie sich vor, ich hätte
rm
stattdessen verwendetecho
.Also, erste Regel: Zitieren Sie immer Ihre Variablen. Sie können entweder
"$foo"
oder"${foo}"
aber so oder so zitieren. Weitere Informationen zur sicheren Verwendung von Variablen finden Sie in den folgenden Beiträgen:quelle
$ var="foo *"
sein$ foo="foo *"
? Sie verwendenvar
nirgendwo.