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?

1116voto

Fred Foo Punkte 341230

In diesem speziellen Beispiel macht das keinen Unterschied. Allerdings ist die {} en ${} sind nützlich, wenn Sie die Variable erweitern wollen foo in der Zeichenkette

"${foo}bar"

seit "$foobar" würde stattdessen die Variable erweitern, die durch foobar .

Geschweifte Klammern sind auch unbedingt erforderlich, wenn:

  • expandierende Array-Elemente, wie in ${array[42]}
  • mit Hilfe von Parametererweiterungsoperationen, wie in ${filename%.*} (Erweiterung entfernen)
  • Erweiterung der Positionsparameter über 9 hinaus: "$8 $9 ${10} ${11}"

Dies sollte überall geschehen und nicht nur in potenziell zweideutigen Fällen, puede als gute Programmierpraxis angesehen werden. Dies dient sowohl der Konsistenz als auch der Vermeidung von Überraschungen wie $foo_$bar.jpg , wo es nicht offensichtlich ist, dass der Unterstrich Teil des Variablennamens wird.

175voto

Aaron McDaid Punkte 25409

Variablen werden deklariert und zugewiesen ohne $ und ohne {} . Sie müssen Folgendes verwenden

var=10

zuzuordnen. Um aus der Variable zu lesen (mit anderen Worten, die Variable zu "erweitern"), müssen Sie $ .

$var      # use the variable
${var}    # same as above
${var}bar # expand var, and append "bar" too
$varbar   # same as ${varbar}, i.e expand a variable called varbar, if it exists.

Das hat mich manchmal verwirrt - in anderen Sprachen bezeichnen wir die Variable auf die gleiche Weise, unabhängig davon, ob sie links oder rechts von einer Zuweisung steht. Aber Shell-Skripting ist anders, $var=10 tut nicht das, was Sie vielleicht denken, dass es tut!

43voto

glenn jackman Punkte 221248

Sie verwenden {} für die Gruppierung. Die geschweiften Klammern sind erforderlich, um Array-Elemente zu derefenzieren. Beispiel:

dir=(*)           # store the contents of the directory into an array
echo "${dir[0]}"  # get the first entry.
echo "$dir[0]"    # incorrect

31voto

SierraX Punkte 311

Innerhalb der geschweiften Klammern können Sie auch einige Textmanipulationen vornehmen:

STRING="./folder/subfolder/file.txt"
echo ${STRING} ${STRING%/*/*}

結果

./folder/subfolder/file.txt ./folder

oder

STRING="This is a string"
echo ${STRING// /_}

結果

This_is_a_string

Du hast recht, "reguläre Variablen" werden nicht benötigt... Aber es ist hilfreicher für die Fehlersuche und um ein Skript zu lesen.

24voto

codeforester Punkte 33470

Geschweifte Klammern werden immer benötigt, um auf Array-Elemente zuzugreifen und eine Klammererweiterung durchzuführen.

Es ist gut, nicht übervorsichtig zu sein und die {} für die Shell-Variablenexpansion, auch wenn es keinen Spielraum für Mehrdeutigkeit gibt.

Zum Beispiel:

dir=log
prog=foo
path=/var/${dir}/${prog}      # excessive use of {}, not needed since / can't be a part of a shell variable name
logfile=${path}/${prog}.log   # same as above, . can't be a part of a shell variable name
path_copy=${path}             # {} is totally unnecessary
archive=${logfile}_arch       # {} is needed since _ can be a part of shell variable name

Es ist also besser, die drei Zeilen wie folgt zu schreiben:

path=/var/$dir/$prog
logfile=$path/$prog.log
path_copy=$path

die eindeutig besser lesbar ist.

Da ein Variablenname nicht mit einer Ziffer beginnen kann, braucht die Shell keine {} um nummerierte Variablen (wie $1 , $2 usw.), es sei denn, auf diese Erweiterung folgt eine Ziffer. Das ist zu spitzfindig, und es ist notwendig, explizit {} in solchen Kontexten:

set app      # set $1 to app
fruit=$1le   # sets fruit to apple, but confusing
fruit=${1}le # sets fruit to apple, makes the intention clear

Siehe:

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