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".