988 Stimmen

Wann brauchen wir geschweifte Klammern um Shell-Variablen?

Wann verwenden wir in Shell-Skripten {} bei der Erweiterung von Variablen?

Ich habe zum Beispiel Folgendes gesehen:

var=10        # Declare variable

echo "${var}" # One use of the variable
echo "$var"   # Another use of the variable

Gibt es einen signifikanten Unterschied, oder ist es nur der Stil? Wird die eine gegenüber der anderen bevorzugt?

18voto

Sridhar Sarnobat Punkte 21937

Das Ende des Variablennamens wird normalerweise durch ein Leerzeichen oder einen Zeilenumbruch gekennzeichnet. Was aber, wenn wir nach dem Ausdruck des Variablenwerts kein Leerzeichen oder keinen Zeilenumbruch haben wollen? Die geschweiften Klammern sagen dem Shell-Interpreter, wo das Ende des Variablennamens ist.

Klassisches Beispiel 1) - Shell-Variable ohne Leerzeichen am Ende

TIME=10

# WRONG: no such variable called 'TIMEsecs'
echo "Time taken = $TIMEsecs"

# What we want is $TIME followed by "secs" with no whitespace between the two.
echo "Time taken = ${TIME}secs"

Beispiel 2) Java-Klassenpfad mit versionierten Jars

# WRONG - no such variable LATESTVERSION_src
CLASSPATH=hibernate-$LATESTVERSION_src.zip:hibernate_$LATEST_VERSION.jar

# RIGHT
CLASSPATH=hibernate-${LATESTVERSION}_src.zip:hibernate_$LATEST_VERSION.jar

(Freds Antwort sagt dies bereits aus, aber sein Beispiel ist ein wenig zu abstrakt)

4voto

Fabio Natalini Punkte 189

Entsprechend dem Vorschlag von SierraX und Peter zur Textmanipulation, geschweifte Klammern {} werden z. B. verwendet, um eine Variable an einen Befehl zu übergeben:

Nehmen wir an, Sie haben eine sposi.txt Datei, die die erste Zeile eines bekannten italienischen Romans enthält:

> sposi="somewhere/myfolder/sposi.txt"
> cat $sposi

Ausfluss: quel ramo del lago di como che volge a mezzogiorno

Erstellen Sie nun zwei Variablen:

# Search the 2nd word found in the file that "sposi" variable points to
> word=$(cat $sposi | cut -d " " -f 2)

# This variable will replace the word
> new_word="filone"

Ersetzen Sie nun die Wort Variableninhalt mit dem von neues_Wort in der Datei sposi.txt

> sed -i "s/${word}/${new_word}/g" $sposi
> cat $sposi

Ausfluss: quel filone del lago di como che volge a mezzogiorno

Das Wort "ramo" wurde ersetzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X