Parentesi graffe ( $var
vs. ${var}
)
Nella maggior parte dei casi, $var
e ${var}
sono gli stessi:
var=foo
echo $var
# foo
echo ${var}
# foo
Le parentesi graffe sono necessarie solo per risolvere l'ambiguità nelle espressioni:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
Citazioni ( $var
vs. "$var"
vs."${var}"
)
Quando aggiungi virgolette doppie attorno a una variabile, dici alla shell di trattarla come una singola parola, anche se contiene spazi bianchi:
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
Contrasta quel comportamento con quanto segue:
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
Come per $var
vs. ${var}
, le parentesi graffe sono necessarie solo per chiarimenti, ad esempio:
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
Nota che "${var}bar"
nel secondo esempio sopra potrebbe anche essere scritto "${var}"bar
, nel qual caso non hai più bisogno delle parentesi graffe, cioè "$var"bar
. Tuttavia, se nella stringa sono presenti molte virgolette, questi moduli alternativi possono risultare difficili da leggere (e quindi difficili da mantenere). Questa pagina fornisce una buona introduzione alle citazioni in Bash.
Array ( $var
vs. $var[@]
vs.${var[@]}
)
Ora per il tuo array. Secondo il manuale di bash :
Fare riferimento a una variabile di matrice senza un pedice equivale a fare riferimento alla matrice con un pedice di 0.
In altre parole, se non si fornisce un indice con []
, si ottiene il primo elemento dell'array:
foo=(a b c)
echo $foo
# a
Che è esattamente lo stesso di
foo=(a b c)
echo ${foo}
# a
Per ottenere tutti gli elementi di un array, è necessario utilizzare @
come indice, ad es ${foo[@]}
. Le parentesi graffe sono richieste con le matrici perché senza di esse la shell espanderebbe $foo
prima la parte, dando il primo elemento dell'array seguito da un valore letterale [@]
:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
Questa pagina è una buona introduzione agli array in Bash.
Citazioni rivisitate ( ${foo[@]}
vs. "${foo[@]}"
)
Non hai chiesto questo, ma è una sottile differenza che è bene sapere. Se gli elementi nell'array potrebbero contenere spazi bianchi, è necessario utilizzare virgolette doppie in modo che ogni elemento sia trattato come una "parola:"
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
Contrasta questo con il comportamento senza virgolette doppie:
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?