Zahnspange ( $var
vs. ${var}
)
In den meisten Fällen $var
und ${var}
sind die gleichen:
var=foo
echo $var
# foo
echo ${var}
# foo
Die geschweiften Klammern werden nur benötigt, um Mehrdeutigkeiten in Ausdrücken aufzulösen:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
Zitate ( $var
vs. "$var"
vs. "${var}"
)
Wenn Sie eine Variable in doppelte Anführungszeichen setzen, weisen Sie die Shell an, sie als einzelnes Wort zu behandeln, auch wenn sie Leerzeichen enthält:
var="foo bar"
for i in "$var"; do # Expands to 'for i in "foo bar"; do...'
echo $i # so only runs the loop once
done
# foo bar
Vergleichen Sie dieses Verhalten mit Folgendem:
var="foo bar"
for i in $var; do # Expands to 'for i in foo bar; do...'
echo $i # so runs the loop twice, once for each argument
done
# foo
# bar
Wie bei $var
vs. ${var}
werden die Klammern nur zur Begriffsklärung benötigt, zum Beispiel:
var="foo bar"
for i in "$varbar"; do # Expands to 'for i in ""; do...' since there is no
echo $i # variable named 'varbar', so loop runs once and
done # prints nothing (actually "")
var="foo bar"
for i in "${var}bar"; do # Expands to 'for i in "foo barbar"; do...'
echo $i # so runs the loop once
done
# foo barbar
Beachten Sie, dass "${var}bar"
im zweiten Beispiel oben auch geschrieben werden könnte "${var}"bar
, in welchem Fall Sie die Klammern nicht mehr benötigen, dh "$var"bar
. Wenn Ihre Zeichenfolge jedoch viele Anführungszeichen enthält, können diese alternativen Formulare schwer lesbar (und daher schwer zu pflegen) sein. Diese Seite bietet eine gute Einführung in das Zitieren in Bash.
Arrays ( $var
vs. $var[@]
vs. ${var[@]}
)
Nun zu Ihrem Array. Laut Bash-Handbuch :
Das Verweisen auf eine Array-Variable ohne Index entspricht dem Verweisen auf das Array mit einem Index von 0.
Mit anderen Worten, wenn Sie keinen Index mit angeben []
, erhalten Sie das erste Element des Arrays:
foo=(a b c)
echo $foo
# a
Welches ist genau das gleiche wie
foo=(a b c)
echo ${foo}
# a
Um alle Elemente eines Arrays abzurufen, müssen Sie @
als Index verwenden, z ${foo[@]}
. Die geschweiften Klammern sind für Arrays erforderlich, da die Shell ohne sie den $foo
Teil zuerst erweitern würde und das erste Element des Arrays gefolgt von einem Literal ergibt [@]
:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
Diese Seite ist eine gute Einführung in Arrays in Bash.
Zitate überarbeitet ( ${foo[@]}
vs. "${foo[@]}"
)
Sie haben nicht danach gefragt, aber es ist ein subtiler Unterschied, über den Sie gut Bescheid wissen sollten. Wenn die Elemente in Ihrem Array Leerzeichen enthalten könnten, müssen Sie doppelte Anführungszeichen verwenden, damit jedes Element als separates "Wort" behandelt wird:
foo=("the first" "the second")
for i in "${foo[@]}"; do # Expands to 'for i in "the first" "the second"; do...'
echo $i # so the loop runs twice
done
# the first
# the second
Vergleichen Sie dies mit dem Verhalten ohne doppelte Anführungszeichen:
foo=("the first" "the second")
for i in ${foo[@]}; do # Expands to 'for i in the first the second; do...'
echo $i # so the loop runs four times!
done
# the
# first
# the
# second
bash
Skript.