$...
denota uma variável e, quando seguida por parêntese de texto, ${...}
, você fornece um limite para a variável, para poder executá-la ao lado de uma string como:
$ FLAVOUR="cheese"
$ echo "I like ${FLAVOUR}y crisps"
I like cheesey crisps
Sem parênteses, você veria:
$ echo "I like $FLAVOURy crisps"
I like crisps
O que, embora seja verdade, não é o que você realmente queria.
Por que é usado em seu exemplo está além de mim. Não é necessário.
As chaves são também usadas para pesquisas de matriz bash quando você deseja especificar o índice, mas isso não tem nada a ver com o seu exemplo:
$ arr=(*)
$ echo ${arr[3]} # print third item; 1-indexed? blimey.
jumbo-small.jpg
$echo ${arr[@]} # print whole array
glyphicons-halflings.png glyphicons-halflings-white.png jumbo.jpg jumbo-small.jpg