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

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

Re: [shell-script] Nome próprio - Mudar de minúscula p/ maiúscula


From: Julio C. Neves
Subject: Re: [shell-script] Nome próprio - Mudar de minúscula p/ maiúscula
Date: Wed, 20 Jan 2010 09:21:42 -0200

Fala Moacir,
em cada turma que leciono por esse Brasilzão, tem sempre um ou mais
destaques (como em escola de samba ;), nesta turma de BSB foi vc, em Macaé o
Waldirio e o Jujulio, em Curitiba o Lucas,... e por aí vai... Como vc tb é
mestre, sabe que não é o professor que ensina, mas sim o aluno que aprende.
Nós damos as ferramentas e os alunos as usam ou não.

Estou escrevendo isso pq é muito interessante notar que em *todas* as turmas
que leciono, falo da nossa lista, e da necessidade do treinando aqui se
inscrever para consolidar o que ensinei, no entanto o que acontece é que nem
todos se inscrevem, mas os que  se inscrevem viram destaques. Isso é
coincidência? Claro que não! Além da lista ser a melhor que já vi na vida
(ogrigado MrBiTs), as pessoas que, nela se inscrevem durante um treinamento,
é pq desejam aprender, e aí a tarefa do professor fica fácil.

Bem, indo ao ponto: o Bash 4.0 além disso incorporou uma série de
facilidade, nas quais destaco:

====================
Vetores associativos

A partir do Bash 4.0, passou a existir o vetor associativo. Chama-se vetor
associativo, aqueles cujos índices são alfabéticos. As regras que valem para
os vetores inteiros, valem também para os associativos, porém antes de
valorar estes últimos, é obrigatório declará-los.

Exemplo:

*$ declare -A Animais **Obrigatório para vetor associativo*

*$ Animais[cavalo]=doméstico *

*$ Animais[zebra]=selvagem *

*$ Animais[gato]=doméstico *

*$ Animais[tigre]=selvagem *

É impossível gerar todos os elementos de uma só vez, como nos vetores
inteiros. Assim sendo, não funciona a sintaxe:

 Animais =([cavalo]=doméstico [zebra]=selvagem \ [gato]=doméstico
[tigre]=selvagem)

*$ echo ${Animais[@]} *

doméstico selvagem doméstico selvagem

*$ echo ${!Animais[@]} *

gato zebra cavalo tigre

Repare que os valores não são ordenados, ficam armazenados na ordem que são
criados, diferentemente dos vetores inteiros que ficam em ordem numérica.

Supondo que esse vetor tivesse centenas de elementos, para listar
separadamente os domésticos dos selvagens, poderíamos fazer um *script*assim:

*$ cat animal.sh*

#!/bin/bash

# Separa animais selvagens e domésticos

declare -A Animais

Animais[cavalo]=doméstico *Criando vetor para teste*

Animais[zebra]=selvagem *Criando vetor para teste*

Animais[gato]=doméstico *Criando vetor para teste*

Animais[tigre]=selvagem *Criando vetor para teste*

Animais[urso pardo]=selvagem *Criando vetor para teste*

for Animal in "${!Animais[@]}" *Percorrendo vetor pelo índice*

do

 if [[ "${Animais[$Animal]}" == selvagem ]]

 then

 Sel=("${Sel[@]}" "$Animal") *Gerando vetor p/ selvagens*

 else

 Dom=("${Dom[@]}" "$Animal") *Gerando vetor p/ domésticos*

 fi

done

# Operador condicional, usado para descobrir qual

#+ vetor tem mais elementos. Veja detalhes na seção

#+ O interpretador aritmético do Shell

Maior=$[${#Dom[@]}>${#Sel[@]}?${#Dom[@]}:${#Sel[@]}]

clear

tput bold; printf "%-15s%-15s\n" Domésticos Selvagens; tput sgr0

for ((i=0; i<$Maior; i++))

{

 tput cup $[1+i] 0; echo ${Dom[i]}

 tput cup $[1+i] 14; echo ${Sel[i]}

}

Gostaria de chamar a sua atenção para um detalhe: neste *script* me referi a
um elemento de vetor associativo empregando ${Animais[$Animal]} ao passo que
me referi a um elemento de um vetor inteiro usando ${Sel[i]}. Ou seja,
quando usamos uma variável como índice de um vetor inteiro, não precisamos
prefixá-la com um cifrão ($), ao passo que no vetor associativo, o cifrão($) é
obrigatório.
Lendo um arquivo para um vetor

Ainda falando do Bash 4.0, eis que ele surge com uma outra novidade: o
comando intrínseco (*builtin*) mapfile, cuja finalidade é jogar um arquivo
de texto inteiro para dentro de um vetor, sem *loop* ou substituição de
comando

   -

   EPA! Isso deve ser muito rápido!
   -

   E é. Faça os teste e comprove!

Exemplo:

*$ cat frutas *

abacate

maçã

morango

pera

tangerina

uva

*$ mapfile vet < frutas **Mandando frutas para vetor vet*

*$ echo ${vet[@]} **Listando todos elementos de vet*

abacate maçã morango pera tangerina uva

Obteríamos resultado idêntico se fizéssemos:

*$ vet=($(cat frutas))*

Porém isso seria mais lento porque a substituição de comando é executada em
um *subshell*.

Uma outra forma de fazer isso que logo vem à cabeça é ler o arquivo com a
opção -a do comando read. Vamos ver como seria o comportamento disso:

*$ read -a vet < frutas *

$ echo ${vet[@]}

abacate

Como deu para perceber, foi lido somente o primeiro registro de frutas.

====================

Outra coisa que destaco são os coprocessos. Esta técnica permite iniciar
diversos processos simultaneamente e sincronizá-los com o shell chamador a
qq momento desejado. Assim sendo, se desejamos fazer wget em diversas
páginas, não é mais necessário enfileirar esta requisições, basta criar um
coprocesso para cada página, sincronizando-os no fim de cada wget, ou seja,
é o famoso thread.

A medida que surgirem oportunidades, vou postando na lista, mas tb vou
publicá-las no changelog da 8a edição do meu livro, que fica na minha página
(www.julioneves.com)

PS: O Moacir disse publicamente aqui na lista que está sempre mexendo com
strings.

- Moacir, cuidado! Mexer com strings dá cadeia!   ;)
Abraços,
Julio
Cursos de Shell e Zenity em 2 fins de semana?
- Em SP ligue (11)2125-4747;
- Em DF ligue (61) 3223-3000;
- Turmas fechadas em outras cidades ligue (21) 8112-9988.



2010/1/19 Moacir Souza <address@hidden>

>
>
> Daniel,
>
> Parâmetros como o \U, \L, \E são bastante úteis, mas não aparecem
> no man do sed (ao menos no meu). Para maiores detalhes, acesse info
> sed e busque pela seção * The "s" Command:: `sed''s Swiss Army Knife.
>
> []'s,
> Moacir Filho
>
> P.S.: Mestre Julio, tem que aparecer aqui por Brasília de novo para
> uma atualização do Curso de Shell com essas magavilhas do bash 4,
> hein? (E para tomar um chope comigo e com o Pastore, claro).
>
> 2010/1/19 Julio C. Neves <address@hidden <julio.neves%40gmail.com>
> >:
>
> > Fala Daniel,
> > Isso não vai resolver o teu problema especificamente, mas vale para
> mostrar
> > para o pessoal as novidades do bash 4.0 que estou incorporando ao meu
> livro.
> >
> >
> >   -
> >
> >   ${parâmetro^}
> >   -
> >
> >   ${parâmetro,}
> >
> > Essas expansões foram introduzidas a partir do Bash 4.0 e modificam a
> caixa
> > das letras do texto que está sendo expandido. Quando usamos circunflexo
> (^),
> > a expansão é feita para maiúsculas e quando usamos vírgula (,), a
> expansão é
> > feita para minúsculas.
> >
> > Exemplo:
> >
> > *$ Nome="botelho"*
> >
> > *$ echo ${Nome^} *
> >
> > Botelho
> >
> > *$ echo ${Nome^^} *
> >
> > BOTELHO
> >
> >
> >  *$ Nome="botelho carvalho"*
> >
> > *$ echo ${Nome^} *
> >
> > *Botelho carvalho **Que pena...*
> >
> >
> >  Um fragmento de *script* que pode facilitar a sua vida:
> >
> > read -p "Deseja continuar (s/n)? "
> >
> > [[ ${REPLY^} == N ]] && exit
> >
> >
> >  Esta forma evita testarmos se a resposta dada foi um N (maiúsculo) ou um
> n
> > (minúsculo).
> >
> > No *Windows*, além dos vírus e da instabilidade, também são frequentes
> nomes
> > de arquivos com espaços em branco e quase todos em maiúsculas. No exemplo
> > anterior, vimos como trocar os espaços em branco por sublinha (_), no
> > próximo veremos como passá-los para minúsculas:
> >
> > *$ cat trocacase.sh*
> >
> > #!/bin/bash
> >
> > # Se o nome do arquivo tiver pelo menos uma
> >
> > #+ letra maiúscula, troca-a para minúscula
> >
> >  for Arq in *[A-Z]* *Pelo menos 1 minúscula*
> >
> > do
> >
> >  if [ -f "${Arq,,}" ] *Arq em minúsculas já existe?*
> >
> >  then
> >
> >  echo ${Arq,,} já existe
> >
> > else
> >
> >  mv "$Arq" "${Arq,,}"
> >
> >  fi
> >
> > done
> >
> > Abraços,
> > Julio
> > Cursos de Shell e Zenity em 2 fins de semana?
> > - Em SP ligue (11)2125-4747;
> > - Em DF ligue (61) 3223-3000;
> > - Turmas fechadas em outras cidades ligue (21) 8112-9988.
> >
> >
> >
> > 2010/1/19 Daniel Merli Morais <address@hidden<dmerlimorais%40gmail.com>
> >
> >
> >>
> >>
> >> Pessoal, como converter apenas o primeiro caracter de cada palavra p/
> >> maiúsculo? Por exemplo, em um arquivo que contenha nomes próprios:
> >>
> >> João silva
> >> Fulano ciclano
> >> Maria oliveira
> >>
> >> Deveria ficar da seguinte forma:
> >>
> >> João Silva
> >> Fulano Ciclano
> >> Maria Oliveira
> >>
> >> Com o sed consigo localizar o padrão espaço+minúscula: / [a-z]/, porém
> não
> >> consigo substituir a primeira letra após o espaço por sua correspondente
> em
> >> maiúscula. Disse a primeira letra após o espaço porque a primeira letra
> de
> >> cada linha já está em maiúscula no meu arquivo, então só precisaria me
> >> preocupar com os sobrenomes.
> >>
> >> Obrigado desde já.
> >>
> >> --
> >> "A maior virtude do sábio é mostrar-se ignorante diante daquilo que
> >> desconhece"
> >>
> >> Daniel Merli Morais
> >> Enterprise Application Integration - Configuration Manager
> >> Sprint / IBM Brasil
> >> MSN: address@hidden <merlipol%40hotmail.com> <merlipol%
> 40hotmail.com>
>
> >> LinkedIn: www.linkedin.com/in/dmerlimorais
> >>
> >> [As partes desta mensagem que não continham texto foram removidas]
> >>
> >>
> >>
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
> > ------------------------------------
>
> >
> > ----------------------------------------------------------
> > Esta lista não admite a abordagem de outras liguagens de programação,
> como perl, C etc. Quem insistir em não seguir esta regra será moderado sem
> prévio aviso.
> > ----------------------------------------------------------
> > Sair da lista: address@hidden<shell-script-unsubscribe%40yahoogrupos.com.br>
> > ----------------------------------------------------------
> > Esta lista é moderada de acordo com o previsto em
> http://www.listas-discussao.cjb.net
> > ----------------------------------------------------------
> > Servidor Newsgroup da lista: news.gmane.org
> > Grupo: gmane.org.user-groups.programming.shell.brazil
> >
> > Links do Yahoo! Grupos
> >
> >
> >
>
> --
> =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
> Moacir da Cruz Souza Filho
>
> -Analista de Sistemas: Suporte Unix Avançado
> Serviço Federal de Processamento de Dados
>
> -Mestrando em Ciências da Computação
> Universidade de Brasília
>
> -Bacharel em Engenharia da Computação
> Escola Politécnica de Pernambuco
> Universidade de Pernambuco
>
> -Técnico em Eletrônica
> Escola Técnica Federal de Pernambuco
>
> -Linux user #449600
> =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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