Suspensórios ( $var
vs. ${var}
)
Na maioria dos casos, $var
e ${var}
são os mesmos:
var=foo
echo $var
# foo
echo ${var}
# foo
Os colchetes são necessários apenas para resolver a ambiguidade nas expressões:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
Citações ( $var
vs. "$var"
vs. "${var}"
)
Ao adicionar aspas duplas em torno de uma variável, você diz ao shell para tratá-lo como uma única palavra, mesmo que contenha espaços em branco:
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
Compare esse comportamento com o seguinte:
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
Assim como no $var
vs. ${var}
, as chaves são necessárias apenas para desambiguação, por exemplo:
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
Observe que "${var}bar"
no segundo exemplo acima também pode ser escrito "${var}"bar
; nesse caso, você não precisa mais dos aparelhos, ou seja "$var"bar
. No entanto, se você tiver muitas aspas em sua sequência, esses formulários alternativos podem ser difíceis de ler (e, portanto, difíceis de manter). Esta página fornece uma boa introdução à citação no Bash.
Matrizes ( $var
vs. $var[@]
vs. ${var[@]}
)
Agora para a sua matriz. De acordo com o manual do bash :
Referenciar uma variável de matriz sem um subscrito é equivalente a referenciar a matriz com um subscrito de 0.
Em outras palavras, se você não fornecer um índice []
, obterá o primeiro elemento da matriz:
foo=(a b c)
echo $foo
# a
Qual é exatamente o mesmo que
foo=(a b c)
echo ${foo}
# a
Para obter todos os elementos de uma matriz, você precisa usar @
como índice, por exemplo ${foo[@]}
. As chaves são necessárias com matrizes porque, sem elas, o shell expandiria a $foo
peça primeiro, fornecendo o primeiro elemento da matriz seguido de um literal [@]
:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
Esta página é uma boa introdução às matrizes no Bash.
Citações revisitadas ( ${foo[@]}
vs. "${foo[@]}"
)
Você não perguntou sobre isso, mas é uma diferença sutil que é bom saber. Se os elementos em sua matriz puderem conter espaços em branco, você precisará usar aspas duplas para que cada elemento seja tratado como uma "palavra:" separada.
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
Compare isso com o comportamento sem aspas duplas:
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?