Quando %
é usado no padrão, ${variable%substring}
ele retornará o conteúdo de variable
com a menor ocorrência de substring
excluídos da parte de trás variable
.
Essa função suporta padrões curinga - é por isso que aceita estrela (asterisco) como um substituto para zero ou mais caracteres.
Deve-se mencionar que isso é específico do Bash - outros shells do linux não contêm necessariamente essa função.
Se você quiser aprender mais sobre manipulação de strings no Bash, sugiro que você leia esta página. Entre outras funções úteis, por exemplo - explica o que %%
faz :)
Edit: Eu esqueci de mencionar que quando é usado em padrão $((variable%number))
ou $((variable1%$variable2))
o %
personagem funcionará como operador de módulo. DavidPostill tem links de documentação mais específicos em sua resposta.
Quando %
é usado em um contexto diferente, deve ser reconhecido apenas como caractere regular.
%%
ou##
, pois isso é memorável e raro o suficiente para encontrar a seção correta rapidamente.man bash
/##