Chaves sempre são necessárias para acessar os elementos da matriz e realizar a expansão da chave.
É bom não ter muito cuidado e usá-lo {}
na expansão de variáveis de shell, mesmo quando não há margem para ambiguidade.
Por exemplo:
dir=log
prog=foo
path=/var/${dir}/${prog} # excessive use of {}, not needed since / can't be a part of a shell variable name
logfile=${path}/${prog}.log # same as above, . can't be a part of a shell variable name
path_copy=${path} # {} is totally unnecessary
archive=${logfile}_arch # {} is needed since _ can be a part of shell variable name
Portanto, é melhor escrever as três linhas como:
path=/var/$dir/$prog
logfile=$path/$prog.log
path_copy=$path
o que é definitivamente mais legível.
Uma vez que um nome de variável não pode começar com um dígito, shell não precisa de {}
variáveis em torno numeradas (como $1
, $2
etc.), a menos que tal expansão é seguido por um dígito. Isso é muito sutil e faz uso explícito {}
em tais contextos:
set app # set $1 to app
fruit=$1le # sets fruit to apple, but confusing
fruit=${1}le # sets fruit to apple, makes the intention clear
Vejo:
{}
é conhecido como expansão de chaves .${}
é conhecido como expansão variável. Eles fazem coisas diferentes. Eu o votaria com exceção do bit sem expansão.