${var%sufixo}
Rói o fim do valor: % tira o menor pedaço, %% o maior.
O espelho do #, apontado para o fim: % remove do fim o casamento mais curto, %% o mais longo. Ler % como "corta a cauda" desfaz a confusão com o irmão.
Dois clássicos: ${arquivo%.*} derruba a extensão, ${caminho%/*} derruba o nome e sobra o diretório — dirname sem subshell.
$ arquivo=larvas.tar.gz
$ echo ${arquivo%.gz}
larvas.tar
$ echo ${arquivo%%.*}
larvas