Isso é chamado de expansão de parâmetro:
-
$3é sua variável, que é o terceiro parâmetro do script / função. -
#removerá o prefixo mais curto da variável. -
?é o padrão que você está procurando (neste caso, é qualquer caractere).
Então, basicamente, você remove o prefixo mais curto da variável chamada 3 até encontrar o padrão.
Em geral, podemos considerar:
${variable_name[option][pattern]}
Existem outras opções como:
-
##remove o maior prefixo. -
%remove o sufixo mais curto. -
%%remove o maior sufixo.
Que você pode combinar com outros padrões, por exemplo, para obter o último campo de uma linha CSV:
> string="asdf,1234,aa,foo22"
> echo ${string##*,}
foo22
Observe como removemos o maior prefixo que procurava pelo padrão "qualquer caractere (s) seguido por uma vírgula".