Bretelles ( $var
vs. ${var}
)
Dans la plupart des cas, $var
et ${var}
sont les mêmes:
var=foo
echo $var
# foo
echo ${var}
# foo
Les accolades ne sont nécessaires que pour résoudre l'ambiguïté dans les expressions:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
Citations ( $var
vs. "$var"
vs. "${var}"
)
Lorsque vous ajoutez des guillemets doubles autour d'une variable, vous dites au shell de la traiter comme un seul mot, même si elle contient des espaces:
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
Comparez ce comportement avec ce qui suit:
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
Comme avec $var
vs. ${var}
, les accolades ne sont nécessaires que pour lever l'ambiguïté, par exemple:
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
Notez que "${var}bar"
dans le deuxième exemple ci-dessus pourrait également être écrit "${var}"bar
, auquel cas vous n'avez plus besoin des accolades, c'est-à-dire "$var"bar
. Cependant, si vous avez beaucoup de guillemets dans votre chaîne, ces formes alternatives peuvent devenir difficiles à lire (et donc à maintenir). Cette page fournit une bonne introduction à la citation dans Bash.
Tableaux ( $var
vs. $var[@]
vs. ${var[@]}
)
Maintenant pour votre tableau. Selon le manuel bash :
Référencer une variable de tableau sans indice équivaut à référencer le tableau avec un indice de 0.
En d'autres termes, si vous ne fournissez pas d'index avec []
, vous obtenez le premier élément du tableau:
foo=(a b c)
echo $foo
# a
Ce qui est exactement le même que
foo=(a b c)
echo ${foo}
# a
Pour obtenir tous les éléments d'un tableau, vous devez utiliser @
comme index, par exemple ${foo[@]}
. Les accolades sont obligatoires avec les tableaux car sans eux, le shell développerait d'abord la $foo
partie, donnant le premier élément du tableau suivi d'un littéral [@]
:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
Cette page est une bonne introduction aux tableaux dans Bash.
Citations revisitées ( ${foo[@]}
vs. "${foo[@]}"
)
Vous n'avez pas posé de questions à ce sujet, mais c'est une différence subtile qu'il est bon de connaître. Si les éléments de votre tableau peuvent contenir des espaces, vous devez utiliser des guillemets doubles pour que chaque élément soit traité comme un «mot» distinct:
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
Comparez cela avec le comportement sans guillemets doubles:
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
script?