shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] pattern match no bash


From: Julio C. Neves
Subject: Re: [shell-script] pattern match no bash
Date: Mon, 13 Aug 2018 11:07:57 -0300

Há muito tempo, nessa mesma lista o Tiago Peczenyj (PacMan) deu uma dica sobre extglob que adaptei para meu livro. Veja:

Estendendo pesquisa de arquivos pelo nome

O Shell possui, além do globbing normal - que são os curingas conhecidos por todos para expansão de nomes de arquivos e diretórios (*, ? e [a-z]) - um globbing estendido. Este globbing estendido, em alguns casos, poderá ser muito útil e sempre será mais veloz que o código que ele substituirá, como o pipe junto com o grep. (normalmente se faria ls <ESCOPO> | grep ... ou echo <ESCOPO> | grep ...)

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)

*(LISTA)

+(LISTA)

@(LISTA)

!(LISTA)

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

$ shopt -s extglob

$ ls arq*

arq arqdados arqdadosdados arqutils

$ ls arq?(dados)

arq arqdados

$ ls arq*(dados)

arq arqdados arqdadosdados

$ ls arq+(dados)

arqdados arqdadosdados

$ ls 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

Obrigado, Tiago Peczenyj!

O Tiago me deu as dicas anteriores, mas existem outras... teste as <opcoes> a seguir dentro do comando shopt -s <opcoes>.

cdspell

Com essa opção ativada, pequenos erros de digitação no nome do diretório para o qual você deseja fazer um cd serão ignorados, isto é, caracteres extras ou esquecidos serão automaticamente corrigidos sem necessidade de redigitação.

No exemplo a seguir, queria fazer um cd rede, que é um diretório abaixo do meu home.

$ cd red

bash: cd: red: Arquivo ou diretório inexistente

$ shopt -s cdspell

$ cd red

rede

$ cd -

/home/jneves

$ cd ede

rede

$ cd -

/home/jneves

$ cd redes

rede

Já viu que essa é uma boa opção para você ter no seu .bashrc, não é?

cmdhist

Essa opção é bacana, pois transforma comandos criados em diversas linhas (como um for ou um while, por exemplo) em uma única linha, com os comandos separados por ponto e vírgula (;). Isso é particularmente útil para editar comandos e reaproveitá-los do history, sendo portanto é uma opção ativada por default pelo bash.

dotglob

Essa opção permite que nomes de arquivos começados por um ponto (.), conhecidos como arquivos escondidos”, sejam expandidos com os metacaracteres curinga.

$ ls *bash*

ls: impossível acessar *bash*: Arquivo ou diretório inexistente

$ shopt -s dotglob

$ ls *bash*

.bash_history .bash_logout .bashrc

Abraços,
Julio

» Não tem tempo para fazer um curso presencial?
» Na sua cidade não tem nenhum bom curso de Linux?
» Conheça nosso portal educacional e estude conosco: 
»  Treinamento presencial (em 4 sábados) no RJ e BSB 
    em http://bit.ly/cursoshelljulioneves                   

Também damos treinamento em sua empresa
em qualquer cidadecom certificado e nota fiscal.

Nosso time de instrutores in company é formado somente por
autores
de Best Sellers
laureados sobre os temas. P. exemplo:

Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico










Em dom, 12 de ago de 2018 às 19:02, Tiago Tarifa Munhoz address@hidden [shell-script] <address@hidden> escreveu:
 

Acertou em cheio Paulo.
Eu estava testando no meu trabalho com o OpenSuSE 15, mas em casa uso o
Gentoo e deu o mesmo problema.
Depois que ativei a opção extglob da forma como você descreveu, o
problema parou de ocorrer.

Algo que ainda não entendo muito são os parâmetros do Bash. Com certeza
é algo que preciso parar para dar uma boa lida.

Para quem não sabe também, no manual a opção extglob diz o seguinte:

/*extglob*//: If set, the extended pattern matching features described
above under //*Pathname Expansion*//are enabled. /(Era exatamente o que
eu precisava)

Obrigado a todos.

address@hidden [shell-script] wrote:
>  
>
> Olá Tiago, tive o mesmo resultado aqui. Na linha de comando funciona,
> num script não.
> Parece ser a opção extglob ligada ou não. Pelo jeito depende da distro.
> Eu ligo no .bash_profile, mas no ambiente do script a opção fica
> desligada.
> Experimente colocar 'shopt -s extglob' no início do script.
> Abraços Paulo
>
> On 8/10/18 3:43 PM, Tiago Tarifa Munhoz address@hidden
> [shell-script] wrote:
> >
> > Vinicius Costa Carvalho:
> >
> > Cara, não deu certo sua dica... mesmo erro. Mas obrigado.
> >
> >
> > Leonardo Goretti:
> >
> > Funcionou certinho. Muito obrigado!
> >
> > Agora fica a dúvida do porque o comando que citei não funciona em um
> script e em linha de comando funciona....
> >
> >
> > Em sex, 10 de ago de 2018 às 14:46, 빠는 Leonardo Goretti
> address@hidden
> > <mailto:address@hidden> [shell-script]
> <address@hidden
> > <mailto:address@hidden>> escreveu:
> >
> > __
> >
> > Tenta
> >
> > du -hsx --exclude=/{proc,sys,dev} /*
> >
> > Em sex, 10 de ago de 2018 às 14:32, Tiago Tarifa Munhoz
> address@hidden
> > <mailto:address@hidden> [shell-script]
> <address@hidden
> > <mailto:address@hidden>> escreveu:
> >
> > __
> >
> > Pessoal,
> > estou fazendo um script que coleta o tamanho dos diretórios na raiz.
> Porém não quero colocar alguns
> > deles como: /proc, /sys, /dev
> >
> > Dentro do script eu coloquei o seguinte comando usando pattern match:
> > du -sh /!(proc|sys|dev)
> >
> > se eu executar o script aparece o seguinte erro:
> > ./teste.sh: line 9: syntax error near unexpected token `('
> > ./teste.sh: line 9: `du -sh /!(proc|sys|dev)'
> >
> > porém se eu executar o mesmo comando direto no shell funciona.
> >
> > Há poderia dar algum pitaco nesse problema?
> > versão do bash: GNU bash, version 4.4.19(1)-release
> (x86_64-suse-linux-gnu)
> >
> >
> >
> > --
> >
> > Leonardo Goretti
> > Gerência e Operações
> > Analista de infraestrutura - GNU/LINUX
> > Instrutor GNU/LINUX
> > Itil V3
> > Celular: +55 (61)  97402-3166
> >
> > Gtalk: address@hidden <mailto:leonardogoretti@gmail..com>
> > U2Ugdm9jw6ogZGVjcnlwdG91IMOpIHBvciBxdWUgc2FiZSBkYXMgY29pc2FzCg==
> > ----------------------------------------------
> >
> >
> >
> > ----------------------------------------------------------
> > Enviado por: Tiago Tarifa Munhoz <address@hidden>
> > ----------------------------------------------------------
> > Responder através da web
>
>


reply via email to

[Prev in Thread] Current Thread [Next in Thread]