Tirantes ( $var
vs. ${var}
)
En la mayoría de los casos, $var
y ${var}
son lo mismo:
var=foo
echo $var
# foo
echo ${var}
# foo
Las llaves solo son necesarias para resolver la ambigüedad en las expresiones:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
Cotizaciones ( $var
vs. "$var"
vs. "${var}"
)
Cuando agrega comillas dobles alrededor de una variable, le dice al shell que la trate como una sola palabra, incluso si contiene espacios en blanco:
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
Contraste ese comportamiento con lo siguiente:
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
Al igual que con $var
vs. ${var}
, las llaves solo son necesarias para la desambiguación, por ejemplo:
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
Tenga "${var}bar"
en cuenta que en el segundo ejemplo anterior también podría escribirse "${var}"bar
, en cuyo caso ya no necesitará las llaves, es decir "$var"bar
. Sin embargo, si tiene muchas citas en su cadena, estas formas alternativas pueden ser difíciles de leer (y, por lo tanto, difíciles de mantener). Esta página proporciona una buena introducción a las citas en Bash.
Arreglos ( $var
vs. $var[@]
vs. ${var[@]}
)
Ahora para tu matriz. De acuerdo con el manual de bash :
Hacer referencia a una variable de matriz sin un subíndice es equivalente a hacer referencia a la matriz con un subíndice de 0.
En otras palabras, si no proporciona un índice []
, obtiene el primer elemento de la matriz:
foo=(a b c)
echo $foo
# a
Que es exactamente lo mismo que
foo=(a b c)
echo ${foo}
# a
Para obtener todos los elementos de una matriz, debe usar @
como índice, por ejemplo ${foo[@]}
. Las llaves se requieren con las matrices porque sin ellas, el shell expandiría la $foo
parte primero, dando el primer elemento de la matriz seguido de un literal [@]
:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
Esta página es una buena introducción a las matrices en Bash.
Cotizaciones revisitadas ( ${foo[@]}
vs. "${foo[@]}"
)
No preguntaste sobre esto, pero es una sutil diferencia que es bueno saber. Si los elementos en su matriz pueden contener espacios en blanco, debe usar comillas dobles para que cada elemento sea tratado como una "palabra" 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 esto con el comportamiento sin comillas dobles:
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?