In diesem Beispiel macht es keinen Unterschied. Die {}
in ${}
sind jedoch nützlich, wenn Sie die Variable foo
in der Zeichenfolge erweitern möchten
"${foo}bar"
da "$foobar"
würde stattdessen die durch identifizierte Variable erweiternfoobar
.
Geschweifte Klammern sind auch unbedingt erforderlich, wenn:
- Array-Elemente erweitern, wie in
${array[42]}
- Verwenden von Parametererweiterungsoperationen wie in
${filename%.*}
(Erweiterung entfernen)
- Erweiterung der Positionsparameter über 9 hinaus:
"$8 $9 ${10} ${11}"
Dies überall zu tun, anstatt nur in möglicherweise mehrdeutigen Fällen, kann als gute Programmierpraxis angesehen werden. Dies dient sowohl der Konsistenz als auch der Vermeidung von Überraschungen $foo_$bar.jpg
, bei denen es visuell nicht offensichtlich ist, dass der Unterstrich Teil des Variablennamens wird.
{}
ist als Klammererweiterung bekannt .${}
ist als variable Expansion bekannt. Sie machen verschiedene Dinge. Ich würde dich bis auf das No-Expansion-Bit positiv bewerten.$()
wird verwendet, um einen Befehl auszuführen, dermd5sum=$(md5sum foo.bin)
die Ausgabe vonmd5sum foo.bin
in der Variablen speichertmd5sum
, auf die jetzt mit zugegriffen werden kann${md5sum}
. Außerdem +1 und viele mehr im Geiste von OP für die Erwähnung, dass es eine gute Praxis ist, explizit zu sein!$()
der Befehl von einer Subshell ausgeführt wird .${1:-20}
ist eine Form der Parametererweiterung. Hier ist es nicht offensichtlich, weil es hauptsächlich Ziffern und arithmetische Operatoren verwendet, die uns täuschen, dass es sich um Arithmetik handelt, aber es bezieht sich tatsächlich auf den Positionsparameter$1
, der, wenn er nicht definiert ist, durch einen Standardwert ersetzt wird20
(die Syntax ist${variable:-default_value}
).Variablen werden ohne
$
und ohne deklariert und zugewiesen{}
. Du musst benutzenzuweisen. Um aus der Variablen zu lesen (mit anderen Worten, erweitern Sie die Variable), müssen Sie verwenden
$
.Das hat mich manchmal verwirrt - in anderen Sprachen beziehen wir uns auf dieselbe Weise auf die Variable, unabhängig davon, ob sie sich links oder rechts von einer Zuweisung befindet. Aber Shell-Scripting ist anders,
$var=10
macht nicht das, was Sie vielleicht denken!quelle
Sie verwenden
{}
für die Gruppierung. Die geschweiften Klammern werden benötigt, um Array-Elemente zu dereferenzieren. Beispiel:quelle
dir=(*)
. Soweit ich weiß,dir
handelt es sich um einen integrierten Befehl zum Auflisten von Verzeichnisinhalten (entsprichtls -C -b
). Könntest du bitte erklären?dir
ist der Name der Variablen, und die Klammern werden verwendet, um die Dateinamenerweiterung*
in einem Array zu sammeln .Sie können auch Textmanipulationen in geschweiften Klammern vornehmen:
Ergebnis:
oder
Ergebnis:
Sie haben Recht, "reguläre Variablen" werden nicht benötigt ... Aber es ist hilfreicher für das Debuggen und das Lesen eines Skripts.
quelle
Das Ende des Variablennamens wird normalerweise durch ein Leerzeichen oder eine neue Zeile gekennzeichnet. Aber was ist, wenn wir nach dem Drucken des Variablenwerts kein Leerzeichen oder keine neue Zeile möchten? Die geschweiften Klammern teilen dem Shell-Interpreter mit, wo sich das Ende des Variablennamens befindet.
Klassisches Beispiel 1) - Shell-Variable ohne nachfolgendes Leerzeichen
Beispiel 2) Java-Klassenpfad mit versionierten Jars
(Freds Antwort besagt dies bereits, aber sein Beispiel ist etwas zu abstrakt.)
quelle
Geschweifte Klammern werden immer benötigt, um auf Array-Elemente zuzugreifen und die Klammererweiterung durchzuführen.
Es ist gut, nicht zu vorsichtig zu sein und
{}
für die Erweiterung von Shell-Variablen zu verwenden, auch wenn kein Raum für Mehrdeutigkeiten besteht.Zum Beispiel:
Es ist also besser, die drei Zeilen wie folgt zu schreiben:
das ist definitiv besser lesbar.
Da ein Variablenname nicht mit einer Ziffer beginnen kann, ist Shell nicht brauchen
{}
um nummerierte Variablen (wie$1
,$2
etc.) , sofern eine solche Expansion durch eine Ziffer folgt. Das ist zu subtil und macht es{}
in solchen Kontexten explizit zu verwenden :Sehen:
quelle
It's good to be not over-cautious
: Ich frage mich, was die meisten Leute denken. Verwenden Sie immer geschweifte Klammern, damit Sie sie nicht vergessen, wenn sie benötigt werden, oder verwenden Sie sie nur bei Bedarf, um die Lesbarkeit zu verbessern.Gemäß dem Vorschlag von SierraX und Peter zur Textmanipulation werden geschweifte Klammern
{}
verwendet, um eine Variable an einen Befehl zu übergeben, zum Beispiel:Angenommen , Sie haben eine sposi.txt- Datei, die die erste Zeile eines bekannten italienischen Romans enthält:
Ausgabe:
quel ramo del lago di como che volge a mezzogiorno
Erstellen Sie nun zwei Variablen:
Jetzt ersetzen Sie den Wort variable Inhalte mit dem von new_word , innerhalb sposi.txt Datei
Ausgabe:
quel filone del lago di como che volge a mezzogiorno
Das Wort "Ramo" wurde ersetzt.
quelle
weel-known novel
Bit reparieren . Trotzdem positiv bewertet.