Eu vejo muita ${VARIABLE}
sintaxe de tipo nos scripts. Qual é o sentido dos aparelhos?
Delimita a variável.
Você pode precisar de $ FOO como variável, mas precisa concatená-lo com outro texto. Nesse caso, isso não funcionará:
echo "$FOObar"
Isso irá reclamar que não há variável $ FOObar. Para contornar isso, delimite a variável:
echo "${FOO}bar"
Isso funcionará e imprimirá o valor de $ FOO com o texto 'bar' concatenado.
É uma daquelas coisas que as pessoas geralmente escolhem fazer o tempo todo, para evitar problemas onde é realmente necessário. Pode ser um bom hábito entrar, pois o script bash é muito implacável quanto a erros de sintaxe.
@mauvedeity está correto. O problema não é apenas o fato de alguns caracteres, quando escritos após uma referência variável serem considerados parte dessa referência - também é o fato de que alguns caracteres são considerados não fazer parte dela. Isso interrompe, por exemplo, operações de manipulação de variáveis e uso de matrizes.
Matrizes :
$ foo=( one two three )
$ echo $foo # implied first element with index 0
one
$ echo $foo[1] # this will not work, as [1] is not considered part of variable
one[1]
$ echo ${foo[1]} # this will work
two
$ echo ${foo[*]} # all elements
one two three
$ echo ${#foo[*]} # array length
3
$ echo ${#foo[2]} # length of third element (index 2)
5
Operações variáveis
$ file=filename.txt
$ echo $file
filename.txt
$ echo ${file%.txt} # remove last match of .txt in $file
filename
Tudo isso falharia (como ilustrado no exemplo da matriz) se não definíssemos explicitamente os delimitadores para a referência da variável.