De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Expansão de Parâmetros - Parte 1

Colaboração: Julio Cezar Neves

Data de Publicação: 26 de setembro de 2021

As expansões de parâmetros são ferramentas muito versáteis, já que substituem diversos comandos e muito rápidas, pois atuam como variáveis e não como comandos.

Sua versatilidade deve-se também ao fato de quando estão trabalhando com cadeias, permitirem o uso do globbing normal - que são os curingas conhecidos por todos para expansão de nomes de arquivos e diretórios (*, ?, [a-z] e [!a-z]) - um globbing estendido, que por ser muito desconhecido, é necessário que se fale um pouco sobre ele

Entendendo o extglob

Quem habilita seu uso é a opção extglob, cujo padrão (default) é estar ativa. Por motivo didático, sempre vou ligar esta opção antes de usá-la, mas isso normalmente não é necessário (mas dentro de um script, é obrigatório). Por via das dúvidas, veja como saber seu estado:

$ shopt extglob     # Lista estado da facilidade
extglob        off  # Está desligado

Está desligado, então para termos certeza que ele sempre estará ligado, podemos fazer:

$ shopt extglob | grep off && shopt -s extglob
$ shopt extglob
extglob        on    # Agora foi ligado

Então, conforme dá para notar por este exemplo, ligamos esta facilidade com a opção -s do comando shopt.

Nas linhas a seguir, LISTA contém um ou mais padrões separados por uma barra vertical (|), que, diga-se de passagem, é tratada como um OU lógico em expressões regulares e em diversos comandos que em sua sintaxe aceitam a formação de padrões de pesquisa usando os caracteres coringa (como o comando case, por exemplo). Veja:

?(LISTA) Casa zero ou uma ocorrência de LISTA (exatamente como em uma expressão regular, já que torna LISTA opcional).
*(LISTA) Casa zero ou mais ocorrências de LISTA (exatamente como em uma expressão regular).
+(LISTA) Casa uma ou mais ocorrências de LISTA (exatamente como em uma expressão regular).
@(LISTA) Casa com exatamente uma ocorrência de LISTA.
!(LISTA) Casa com qualquer coisa, exceto com LISTA (A exclamação (!) em diversos comandos (como exemplo o test) é tratada como negação).

Para poder utilizá-los precisa executar o comando shopt -s conforme o exemplo a seguir:

$ shopt -s extglob                     # Liga a facilidade (argumento) extglob
$ ls arq*
arq    arqdados    arqdadosdados    arqutils 
$ echo arq?(dados)
arq arqdados 
$ ls arq*(dados)
arq    arqdados    arqdadosdados
$ ls arq+(dados)
arqdados    arqdadosdados 
$ echo arq@(dados)
arqdados 
$ ls arq!(dados)                       # Divertido esse
arq    arqdadosdados    arqutils 
$ ls arq+(dados|utils)
arqdados    arqdadosdados    arqutils 
$ ls arq@(dados|utils)                 # O mesmo que ls arq {dados,utils}
arqdados    arqutils 
$ ls *meng+(a|o)?(o).+(gif|jpg|png)    # Arquivos de imagem do Flamengo
flamengo.gif    mengao.png    mengo.jpg 

Esse último é bem completo e por isso vou desmembrá-lo:

*meng Qualquer coisa (*) seguida de meng
+(a|o) Casa com, pelo menos, um (+) a ou (|) o
?(o). Uma letra o opcional (?) - para o caso de mengao - seguido de um ponto
+(gif|jpg|png) Pelo menos uma dessas extensões (| = OU)

Mas também casaria com indesejados como mengaao, mengoo, ... porque o mais (+) significa "pelo menos 1".

Note que usei echo e ls indiscriminadamente, pois quem faz a expansão é o Shell.

O default do extglob é estar ativo - pelo menos nos ambientes que testei - é bom ter essas expansões sempre em mente, pois podem ser utilizadas em diversos casos, como:

  • No novo comando test ([[ ... ]]);
  • No comando case;
  • Nas Expansões de Parâmetros (que trabalham com cadeias, que é o que agora nos interessa).

Amanhã veremos um resumo das Expansões de Parâmetros para em dias subsequentes destrinchá-las uma a uma.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Julio Cezar Neves