VAR=$VAR1
é uma versão simplificada de VAR=${VAR1}
. Há coisas que o segundo pode fazer que o primeiro não pode, por exemplo, referenciar um índice de matriz (não portátil) ou remover uma substring (POSIX-portable). Veja a seção Mais sobre variáveis do Guia de Bash para iniciantes e Expansão do parâmetro na especificação POSIX.
Usar aspas em torno de uma variável como em rm -- "$VAR1"
ou rm -- "${VAR}"
é uma boa ideia. Isso faz com que o conteúdo da variável seja uma unidade atômica. Se o valor da variável contiver espaços em branco (bem, caracteres na variável $IFS
special, espaços em branco por padrão) ou globbing e você não citar, então cada palavra é considerada para geração de nome de arquivo (globbing) cuja expansão faz tantos argumentos para o que você está fazendo.
$ find .
.
./*r*
./-rf
./another
./filename
./spaced filename
./another spaced filename
./another spaced filename/x
$ var='spaced filename'
# usually, 'spaced filename' would come from the output of some command and you weren't expecting it
$ rm $var
rm: cannot remove 'spaced': No such file or directory
# oops! I just ran 'rm spaced filename'
$ var='*r*'
$ rm $var
# expands to: 'rm' '-rf' '*r*' 'another spaced filename'
$ find .
.
./another
./spaced filename
./another spaced filename
$ var='another spaced filename'
$ rm -- "$var"
$ find .
.
./another
./spaced filename
Na portabilidade: De acordo com POSIX.1-2008 seção 2.6.2 , as chaves são opcionais.