Como a sintaxe “$ {foo ## *.}” funciona para obter extensões de arquivo? [duplicado]

9

Por que esse comando funciona para recuperar com êxito o nome da extensão do arquivo?

file_ext=${filename##*.}
    
por xiaohan2012 22.09.2013 / 16:15

2 respostas

9

Dê uma olhada em man bash (ou qualquer shell que você esteja usando):

   ${parameter##word}
          Remove matching prefix pattern.  The word is expanded to produce
          a pattern just as in pathname expansion.  If the pattern matches
          the  beginning of the value of parameter, then the result of the
          expansion is the expanded value of parameter with  the  shortest
          matching  pattern  (the ''#'' case) or the longest matching pat‐
          tern (the ''##'' case) deleted.  If parameter is  @  or  *,  the
          pattern  removal operation is applied to each positional parame‐
          ter in turn, and the expansion is the resultant list.  If param‐
          eter  is  an array variable subscripted with @ or *, the pattern
          removal operation is applied to each  member  of  the  array  in
          turn, and the expansion is the resultant list.

Assim, no seu caso, ele remove tudo até o último "." e retorna a string restante, que é a extensão do arquivo.

    
por 22.09.2013 / 16:25
12

Isso é descrito na Linguagem de comandos do shell POSIX :

${parameter##word}

Remove Largest Prefix Pattern. The word shall be expanded to produce a pattern. The parameter expansion shall then result in parameter, with the largest portion of the prefix matched by the pattern deleted.

Nesse caso específico, *. é expandido para a maior subseqüência que termina com . ( * correspondente a qualquer coisa) e a maior subseqüência é removida. Então, apenas a extensão do arquivo é deixada.

Observe que nada é removido se o nome do arquivo não contiver um . , portanto, tenha cuidado ao usar isso em scripts, o comportamento pode não ser o esperado.

    
por 22.09.2013 / 16:25