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.
Post by Moacir SouzaDaniel,
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).
Post by Julio C. NevesFala Daniel,
Isso não vai resolver o teu problema especificamente, mas vale para
mostrar
Post by Julio C. Nevespara o pessoal as novidades do bash 4.0 que estou incorporando ao meu
livro.
Post by Julio C. Neves-
${parâmetro^}
-
${parâmetro,}
Essas expansões foram introduzidas a partir do Bash 4.0 e modificam a
caixa
Post by Julio C. Nevesdas letras do texto que está sendo expandido. Quando usamos circunflexo
(^),
Post by Julio C. Nevesa expansão é feita para maiúsculas e quando usamos vírgula (,), a
expansão é
Post by Julio C. Nevesfeita para minúsculas.
*$ Nome="botelho"*
*$ echo ${Nome^} *
Botelho
*$ echo ${Nome^^} *
BOTELHO
*$ Nome="botelho carvalho"*
*$ echo ${Nome^} *
*Botelho carvalho **Que pena...*
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
Post by Julio C. Neves(minúsculo).
No *Windows*, além dos vírus e da instabilidade, também são frequentes
nomes
Post by Julio C. Nevesde 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
*$ 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.
Post by Daniel Merli MoraisPessoal, como converter apenas o primeiro caracter de cada palavra p/
João silva
Fulano ciclano
Maria oliveira
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
Post by Julio C. NevesPost by Daniel Merli Moraisconsigo substituir a primeira letra após o espaço por sua correspondente
em
Post by Julio C. NevesPost by Daniel Merli Moraismaiúscula. Disse a primeira letra após o espaço porque a primeira letra
de
Post by Julio C. NevesPost by Daniel Merli Moraiscada 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
40hotmail.com>
Post by Julio C. NevesPost by Daniel Merli MoraisLinkedIn: 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.
Post by Julio C. Neves----------------------------------------------------------
----------------------------------------------------------
Esta lista é moderada de acordo com o previsto em
http://www.listas-discussao.cjb.net
Post by Julio C. Neves----------------------------------------------------------
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]
------------------------------------
---------------------------------------------------------------------
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: shell-script-***@yahoogrupos.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