Verso 1.0.0
Sumrio
I Sobre essa Apostila 2 4 9 18
19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 20 20 20 20 20 21 21 22 23 23 23 24 25 27 27 27 28 28 28 28 29 29 30
1 O que o curso Bash Bsico 2 Plano de ensino 2.1 Objetivo . . . 2.2 Pblico Alvo . 2.3 Pr-requisitos 2.4 Descrio . . 2.5 Metodologia . 2.6 Programa . . 2.7 Avaliao . . 2.8 Bibliograa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 Expresses Regulares 3.1 Introduo . . . . . . . . . . . . . . . . . . 3.2 Comando grep . . . . . . . . . . . . . . . 3.3 Os Metacaractres . . . . . . . . . . . . . 3.4 Metacaractres quanticadores . . . . . . 3.5 Metacaractres tipo ncora . . . . . . . . . 3.5.1 Circunexo . . . . . . . . . . . . 3.5.2 Cifro - o m . . . . . . . . . . . 3.5.3 Borda - a limtrofe . . . . . . . . . 3.6 Outros metacaracteres . . . . . . . . . . 3.7 Explicando-os melhor . . . . . . . . . . . 3.7.1 Escape . . . . . . . . . . . . . . . 3.7.2 Ou . . . . . . . . . . . . . . . . . . 3.7.3 Grupo . . . . . . . . . . . . . . . . 3.7.4 Fim deste percurso de navegao
CDTC
Brasil/DF 31 31 31 32 32 33 35 36 36 36 37 38 39 40 44 44 44 45 46 47 47 49 55 55 55 55 56 58 58 59 60 61 65 65 66 68 71 72 73
4 Parte I 4.1 Dilogo . . . . . . . . . . . . . . . . . . . . . . . . 4.2 O ambiente Linux . . . . . . . . . . . . . . . . . . . 4.3 O ambiente Shell . . . . . . . . . . . . . . . . . . . 4.4 Uma rapidinha nos principais sabores de Shell . . 4.5 Explicando o funcionamento do Shell . . . . . . . 4.6 Caracteres para remoo do signicado . . . . . . 4.7 Caracteres de redirecionamento . . . . . . . . . . 4.7.1 Caracteres de redirecionamento . . . . . . 4.7.2 Redirecionamento da Sada Padro . . . . 4.7.3 Redirecionamento da Sada de erro Padro 4.7.4 Redirecionamento da Entrada Padro . . . 4.8 Redirecionamento de Comandos . . . . . . . . . . 4.9 Caracteres de Ambiente . . . . . . . . . . . . . . . 5 Parte II 5.1 Dilogo . . . . . . . . . . . . . . . . . 5.2 Eu co com o grep, voc com a gripe 5.3 A famlia grep . . . . . . . . . . . . . . 5.4 Exemplos da famlia grep . . . . . . . 5.5 Vamos montar uma cdteca . . . . . . 5.6 Passando parmetros . . . . . . . . . 5.7 Macetes paramtricos . . . . . . . . . 6 Parte III 6.1 Trabalhando com cadeias . . . . . . . 6.2 O comando cut . . . . . . . . . . . . . 6.2.1 O comando cut a opo -c . . 6.2.2 O comando cut a opo -f . . . 6.3 O comando tr . . . . . . . . . . . . . . 6.3.1 Trocando caracteres com tr . . 6.3.2 Removendo caracteres com tr 6.3.3 Xpremendo com tr . . . . . . . 6.3.4 O Comando if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 Parte IV 7.1 Dilogo . . . . . . . . . . . . . . . . . . . . . 7.2 O comando Test . . . . . . . . . . . . . . . . 7.3 Continuao do comando test . . . . . . . . 7.4 Querida, encolheram o comando condicional 7.5 E tome de test . . . . . . . . . . . . . . . . . 7.6 Acaso casa com case . . . . . . . . . . . . .
Parte I
CDTC
Brasil/DF
Contedo
O contedo dessa apostila fruto da compilao de diversos materiais livres publicados na internet, disponveis em diversos sites ou originalmente produzido no CDTC (http://www.cdtc.org.br.) O formato original deste material bem como sua atualizao est disponvel dentro da licena GNU Free Documentation License, cujo teor integral encontra-se aqui reproduzido na seo de mesmo nome, tendo inclusive uma verso traduzida (no ocial). A reviso e alterao vem sendo realizada pelo CDTC (suporte@cdtc.org.br) desde outubro de 2006. Crticas e sugestes construtivas so bem-vindas a qualquer tempo.
Autores
A autoria deste de responsabilidade de Tiago Luiz Batista Maciel, sendo apenas uma organizao do curso disponibilizado por Jlio Neves.. O texto original faz parte do projeto Centro de Difuso de Tecnologia e Conhecimento, que vem sendo realizado pelo ITI (Instituto Nacional de Tecnologia da Informao) em conjunto com outros parceiros institucionais, atuando em conjunto com as universidades federais brasileiras que tem produzido e utilizado Software Livre, apoiando inclusive a comunidade Free Software junto a outras entidades no pas. Informaes adicionais podem ser obtidas atravs do email ouvidoria@cdtc.org.br, ou da home page da entidade, atravs da URL http://www.cdtc.org.br.
Garantias
O material contido nesta apostila isento de garantias e o seu uso de inteira responsabilidade do usurio/leitor. Os autores, bem como o ITI e seus parceiros, no se responsabilizam direta ou indiretamente por qualquer prejuzo oriundo da utilizao do material aqui contido.
Licena
Copyright 2006, Instituto Nacional de Tecnologia da Informao (cdtc@iti.gov.br) . Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Chapter being SOBRE ESSA APOSTILA. A copy of the license is included in the section entitled GNU Free Documentation License.
Parte II
Informaes Bsicas
CDTC
Brasil/DF
Sobre o CDTC
Objetivo Geral O Projeto CDTC visa a promoo e o desenvolvimento de aes que incentivem a disseminao de solues que utilizem padres abertos e no proprietrios de tecnologia, em proveito do desenvolvimento social, cultural, poltico, tecnolgico e econmico da sociedade brasileira. Objetivo Especco Auxiliar o Governo Federal na implantao do plano nacional de software no-proprietrio e de cdigo fonte aberto, identicando e mobilizando grupos de formadores de opinio dentre os servidores pblicos e agentes polticos da Unio Federal, estimulando e incentivando o mercado nacional a adotar novos modelos de negcio da tecnologia da informao e de novos negcios de comunicao com base em software no-proprietrio e de cdigo fonte aberto, oferecendo treinamento especco para tcnicos, prossionais de suporte e funcionrios pblicos usurios, criando grupos de funcionrios pblicos que iro treinar outros funcionrios pblicos e atuar como incentivadores e defensores de produtos de software no proprietrios e cdigo fonte aberto, oferecendo contedo tcnico on-line para servios de suporte, ferramentas para desenvolvimento de produtos de software no proprietrios e de seu cdigo fonte livre, articulando redes de terceiros (dentro e fora do governo) fornecedoras de educao, pesquisa, desenvolvimento e teste de produtos de software livre.
Guia do aluno
Neste guia, voc ter reunidas uma srie de informaes importantes para que voc comece seu curso. So elas: Licenas para cpia de material disponvel Os 10 mandamentos do aluno de Educao a Distncia Como participar dos foruns e da wikipdia Primeiros passos muito importante que voc entre em contato com TODAS estas informaes, seguindo o roteiro acima.
Licena
Copyright 2006, Instituto Nacional de Tecnologia da Informao (cdtc@iti.gov.br). 6
CDTC
Brasil/DF
dada permisso para copiar, distribuir e/ou modicar este documento sob os termos da Licena de Documentao Livre GNU, Verso 1.1 ou qualquer verso posterior pblicada pela Free Software Foundation; com o Capitulo Invariante SOBRE ESSA APOSTILA. Uma cpia da licena est inclusa na seo entitulada "Licena de Documentao Livre GNU".
1. Acesso Internet: ter endereo eletrnico, um provedor e um equipamento adequado pr-requisito para a participao nos cursos a distncia. 2. Habilidade e disposio para operar programas: ter conhecimentos bsicos de Informtica necessrio para poder executar as tarefas. 3. Vontade para aprender colaborativamente: interagir, ser participativo no ensino a distncia conta muitos pontos, pois ir colaborar para o processo ensino-aprendizagem pessoal, dos colegas e dos professores. 4. Comportamentos compatveis com a etiqueta: mostrar-se interessado em conhecer seus colegas de turma respeitando-os e fazendo ser respeitado pelo mesmo. 5. Organizao pessoal: planejar e organizar tudo fundamental para facilitar a sua reviso e a sua recuperao de materiais. 6. Vontade para realizar as atividades no tempo correto: anotar todas as suas obrigaes e realiz-las em tempo real. 7. Curiosidade e abertura para inovaes: aceitar novas idias e inovar sempre. 8. Flexibilidade e adaptao: requisitos necessrio mudana tecnolgica, aprendizagens e descobertas. 9. Objetividade em sua comunicao: comunicar-se de forma clara, breve e transparente ponto - chave na comunicao pela Internet. 10. Responsabilidade: ser responsvel por seu prprio aprendizado. O ambiente virtual no controla a sua dedicao, mas reete os resultados do seu esforo e da sua colaborao.
CDTC
Brasil/DF
todos participantes. Assim, se o monitor ou algum outro participante tiver uma informao que interesse ao grupo, favor post-la aqui. Porm, se o que voc deseja resolver alguma dvida ou discutir algum tpico especco do curso. recomendado que voc faa uso do Forum de dvidas gerais que lhe d recursos mais efetivos para esta prtica. . O frum de dvidas gerais tem por objetivo disponibilizar um meio fcil, rpido e interativo para solucionar suas dvidas e trocar experincias. As mensagens postadas nele so enviadas a todos participantes do curso. Assim, ca muito mais fcil obter respostas, j que todos podem ajudar. Se voc receber uma mensagem com algum tpico que saiba responder, no se preocupe com a formalizao ou a gramtica. Responda! E no se esquea de que antes de abrir um novo tpico recomendvel ver se a sua pergunta j foi feita por outro participante. A segunda forma se d pelas Wikis: . Uma wiki uma pgina web que pode ser editada colaborativamente, ou seja, qualquer participante pode inserir, editar, apagar textos. As verses antigas vo sendo arquivadas e podem ser recuperadas a qualquer momento que um dos participantes o desejar. Assim, ela oferece um timo suporte a processos de aprendizagem colaborativa. A maior wiki na web o site "Wikipdia", uma experincia grandiosa de construo de uma enciclopdia de forma colaborativa, por pessoas de todas as partes do mundo. Acesse-a em portugus pelos links: Pgina principal da Wiki - http://pt.wikipedia.org/wiki/ Agradecemos antecipadamente a sua colaborao com a aprendizagem do grupo!
Primeiros Passos
Para uma melhor aprendizagem recomendvel que voc siga os seguintes passos: Ler o Plano de Ensino e entender a que seu curso se dispe a ensinar; Ler a Ambientao do Moodle para aprender a navegar neste ambiente e se utilizar das ferramentas bsicas do mesmo; Entrar nas lies seguindo a seqncia descrita no Plano de Ensino; Qualquer dvida, reporte ao Frum de Dvidas Gerais.
Perl do Tutor
Segue-se uma descrio do tutor ideal, baseada no feedback de alunos e de tutores. O tutor ideal um modelo de excelncia: consistente, justo e prossional nos respectivos valores e atitudes, incentiva mas honesto, imparcial, amvel, positivo, respeitador, aceita as idias dos estudantes, paciente, pessoal, tolerante, apreciativo, compreensivo e pronto a ajudar. 8
CDTC
Brasil/DF
A classicao por um tutor desta natureza proporciona o melhor feedback possvel, crucial, e, para a maior parte dos alunos, constitui o ponto central do processo de aprendizagem. Este tutor ou instrutor: fornece explicaes claras acerca do que ele espera, e do estilo de classicao que ir utilizar; gosta que lhe faam perguntas adicionais; identica as nossas falhas, mas corrige-as amavelmente, diz um estudante, e explica porque motivo a classicao foi ou no foi atribuda; tece comentrios completos e construtivos, mas de forma agradvel (em contraste com um reparo de um estudante: os comentrios deixam-nos com uma sensao de crtica, de ameaa e de nervossismo) d uma ajuda complementar para encorajar um estudante em diculdade; esclarece pontos que no foram entendidos, ou corretamente aprendidos anteriormente; ajuda o estudante a alcanar os seus objetivos; exvel quando necessrio; mostra um interesse genuno em motivar os alunos (mesmo os principiantes e, por isso, talvez numa fase menos interessante para o tutor); escreve todas as correes de forma legvel e com um nvel de pormenorizao adequado; acima de tudo, devolve os trabalhos rapidamente;
Parte III
10
CDTC
Brasil/DF
(Traduzido pelo Joo S. O. Bueno atravs do CIPSGA em 2001) Esta uma traduo no ocial da Licena de Documentao Livre GNU em Portugus Brasileiro. Ela no publicada pela Free Software Foundation, e no se aplica legalmente a distribuio de textos que usem a GFDL - apenas o texto original em Ingls da GNU FDL faz isso. Entretanto, ns esperamos que esta traduo ajude falantes de portugus a entenderem melhor a GFDL. This is an unofcial translation of the GNU General Documentation License into Brazilian Portuguese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GFDLonly the original English text of the GFDL does that. However, we hope that this translation will help Portuguese speakers understand the GFDL better. Licena de Documentao Livre GNU Verso 1.1, Maro de 2000 Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA permitido a qualquer um copiar e distribuir cpias exatas deste documento de licena, mas no permitido alter-lo.
INTRODUO
O propsito desta Licena deixar um manual, livro-texto ou outro documento escrito "livre"no sentido de liberdade: assegurar a qualquer um a efetiva liberdade de copi-lo ou redistribui-lo, com ou sem modicaes, comercialmente ou no. Secundariamente, esta Licena mantm para o autor e editor uma forma de ter crdito por seu trabalho, sem ser considerado responsvel pelas modicaes feitas por terceiros. Esta Licena um tipo de "copyleft"("direitos revertidos"), o que signica que derivaes do documento precisam ser livres no mesmo sentido. Ela complementa a GNU Licena Pblica Geral (GNU GPL), que um copyleft para software livre. Ns zemos esta Licena para que seja usada em manuais de software livre, por que software livre precisa de documentao livre: um programa livre deve ser acompanhado de manuais que provenham as mesmas liberdades que o software possui. Mas esta Licena no est restrita a manuais de software; ela pode ser usada para qualquer trabalho em texto, independentemente do assunto ou se ele publicado como um livro impresso. Ns recomendamos esta Licena principalmente para trabalhos cujo propsito seja de introduo ou referncia.
APLICABILIDADE E DEFINIES
Esta Licena se aplica a qualquer manual ou outro texto que contenha uma nota colocada pelo detentor dos direitos autorais dizendo que ele pode ser distribudo sob os termos desta Licena. O "Documento"abaixo se refere a qualquer manual ou texto. Qualquer pessoa do pblico um
11
CDTC
Brasil/DF
licenciado e referida como "voc". Uma "Verso Modicada"do Documento se refere a qualquer trabalho contendo o documento ou uma parte dele, quer copiada exatamente, quer com modicaes e/ou traduzida em outra lngua. Uma "Seo Secundria" um apndice ou uma seo inicial do Documento que trata exclusivamente da relao dos editores ou dos autores do Documento com o assunto geral do Documento (ou assuntos relacionados) e no contm nada que poderia ser includo diretamente nesse assunto geral (Por exemplo, se o Documento em parte um livro texto de matemtica, a Seo Secundria pode no explicar nada de matemtica). Essa relao poderia ser uma questo de ligao histrica com o assunto, ou matrias relacionadas, ou de posies legais, comerciais, loscas, ticas ou polticas relacionadas ao mesmo. As "Sees Invariantes"so certas Sees Secundrias cujos ttulos so designados, como sendo de Sees Invariantes, na nota que diz que o Documento publicado sob esta Licena. Os "Textos de Capa"so certos trechos curtos de texto que so listados, como Textos de Capa Frontal ou Textos da Quarta Capa, na nota que diz que o texto publicado sob esta Licena. Uma cpia "Transparente"do Documento signica uma cpia que pode ser lida automaticamente, representada num formato cuja especicao esteja disponvel ao pblico geral, cujos contedos possam ser vistos e editados diretamente e sem mecanismos especiais com editores de texto genricos ou (para imagens compostas de pixels) programas de pintura genricos ou (para desenhos) por algum editor de desenhos grandemente difundido, e que seja passvel de servir como entrada a formatadores de texto ou para traduo automtica para uma variedade de formatos que sirvam de entrada para formatadores de texto. Uma cpia feita em um formato de arquivo outrossim Transparente cuja constituio tenha sido projetada para atrapalhar ou desencorajar modicaes subsequentes pelos leitores no Transparente. Uma cpia que no "Transparente" chamada de "Opaca". Exemplos de formatos que podem ser usados para cpias Transparentes incluem ASCII simples sem marcaes, formato de entrada do Texinfo, formato de entrada do LaTex, SGML ou XML usando uma DTD disponibilizada publicamente, e HTML simples, compatvel com os padres, e projetado para ser modicado por pessoas. Formatos opacos incluem PostScript, PDF, formatos proprietrios que podem ser lidos e editados apenas com processadores de texto proprietrios, SGML ou XML para os quais a DTD e/ou ferramentas de processamento e edio no estejam disponveis para o pblico, e HTML gerado automaticamente por alguns editores de texto com nalidade apenas de sada. A "Pgina do Ttulo"signica, para um livro impresso, a pgina do ttulo propriamente dita, mais quaisquer pginas subsequentes quantas forem necessrias para conter, de forma legvel, o material que esta Licena requer que aparea na pgina do ttulo. Para trabalhos que no tenham uma pgina do ttulo, "Pgina do Ttulo"signica o texto prximo da apario mais proeminente do ttulo do trabalho, precedendo o incio do corpo do texto.
12
CDTC
Brasil/DF
13
CDTC
Brasil/DF
MODIFICAES
Voc pode copiar e distribuir uma Verso Modicada do Documento sob as condies das sees 2 e 3 acima, desde que voc publique a Verso Modicada estritamente sob esta Licena, com a Verso Modicada tomando o papel do Documento, de forma a licenciar a distribuio e modicao da Verso Modicada para quem quer que possua uma cpia da mesma. Alm disso, voc precisa fazer o seguinte na verso modicada: A. Usar na Pgina de Ttulo (e nas capas, se houver alguma) um ttulo distinto daquele do Documento, e daqueles de verses anteriores (que deveriam, se houvesse algum, estarem listados na seo "Histrico do Documento"). Voc pode usar o mesmo ttulo de uma verso anterior se o editor original daquela verso lhe der permisso; B. Listar na Pgina de Ttulo, como autores, uma ou mais das pessoas ou entidades responsveis pela autoria das modicaes na Verso Modicada, conjuntamente com pelo menos cinco dos autores principais do Documento (todos os seus autores principais, se ele tiver menos que cinco); C. Colocar na Pgina de Ttulo o nome do editor da Verso Modicada, como o editor; D. Preservar todas as notas de copyright do Documento; E. Adicionar uma nota de copyright apropriada para suas prprias modicaes adjacente s outras notas de copyright; F. Incluir, imediatamente depois das notas de copyright, uma nota de licena dando ao pblico o direito de usar a Verso Modicada sob os termos desta Licena, na forma mostrada no tpico abaixo; G. Preservar nessa nota de licena as listas completas das Sees Invariantes e os Textos de Capa requeridos dados na nota de licena do Documento; H. Incluir uma cpia inalterada desta Licena; I. Preservar a seo entitulada "Histrico", e seu ttulo, e adicionar mesma um item dizendo pelo menos o ttulo, ano, novos autores e editor da Verso Modicada como dados na Pgina de Ttulo. Se no houver uma sesso denominada "Histrico"no Documento, criar uma dizendo o ttulo, ano, autores, e editor do Documento como dados em sua Pgina de Ttulo, ento adicionar um item descrevendo a Verso Modicada, tal como descrito na sentena anterior; J. Preservar o endereo de rede, se algum, dado no Documento para acesso pblico a uma cpia Transparente do Documento, e da mesma forma, as localizaes de rede dadas no Documento para as verses anteriores em que ele foi baseado. Elas podem ser colocadas na seo "Histrico". Voc pode omitir uma localizao na rede para um trabalho que tenha sido publicado pelo menos quatro anos antes do Documento, ou se o editor original da verso a que ela se rera der sua permisso; K. Em qualquer seo entitulada "Agradecimentos"ou "Dedicatrias", preservar o ttulo da 14
CDTC
Brasil/DF
seo e preservar a seo em toda substncia e m de cada um dos agradecimentos de contribuidores e/ou dedicatrias dados; L. Preservar todas as Sees Invariantes do Documento, inalteradas em seus textos ou em seus ttulos. Nmeros de seo ou equivalentes no so considerados parte dos ttulos da seo; M. Apagar qualquer seo entitulada "Endossos". Tal sesso no pode ser includa na Verso Modicada; N. No reentitular qualquer seo existente com o ttulo "Endossos"ou com qualquer outro ttulo dado a uma Seo Invariante. Se a Verso Modicada incluir novas sees iniciais ou apndices que se qualiquem como Sees Secundrias e no contenham nenhum material copiado do Documento, voc pode optar por designar alguma ou todas aquelas sees como invariantes. Para fazer isso, adicione seus ttulos lista de Sees Invariantes na nota de licena da Verso Modicada. Esses ttulos precisam ser diferentes de qualquer outro ttulo de seo. Voc pode adicionar uma seo entitulada "Endossos", desde que ela no contenha qualquer coisa alm de endossos da sua Verso Modicada por vrias pessoas ou entidades - por exemplo, declaraes de revisores ou de que o texto foi aprovado por uma organizao como a denio ocial de um padro. Voc pode adicionar uma passagem de at cinco palavras como um Texto de Capa da Frente , e uma passagem de at 25 palavras como um Texto de Quarta Capa, ao nal da lista de Textos de Capa na Verso Modicada. Somente uma passagem de Texto da Capa da Frente e uma de Texto da Quarta Capa podem ser adicionados por (ou por acordos feitos por) qualquer entidade. Se o Documento j incluir um texto de capa para a mesma capa, adicionado previamente por voc ou por acordo feito com alguma entidade para a qual voc esteja agindo, voc no pode adicionar um outro; mas voc pode trocar o antigo, com permisso explcita do editor anterior que adicionou a passagem antiga. O(s) autor(es) e editor(es) do Documento no do permisso por esta Licena para que seus nomes sejam usados para publicidade ou para assegurar ou implicar endossamento de qualquer Verso Modicada.
COMBINANDO DOCUMENTOS
Voc pode combinar o Documento com outros documentos publicados sob esta Licena, sob os termos denidos na seo 4 acima para verses modicadas, desde que voc inclua na combinao todas as Sees Invariantes de todos os documentos originais, sem modicaes, e liste todas elas como Sees Invariantes de seu trabalho combinado em sua nota de licena. O trabalho combinado precisa conter apenas uma cpia desta Licena, e Sees Invariantes Idnticas com multiplas ocorrncias podem ser substitudas por apenas uma cpia. Se houver mltiplas Sees Invariantes com o mesmo nome mas com contedos distintos, faa o ttulo de 15
CDTC
Brasil/DF
cada seo nico adicionando ao nal do mesmo, em parnteses, o nome do autor ou editor origianl daquela seo, se for conhecido, ou um nmero que seja nico. Faa o mesmo ajuste nos ttulos de seo na lista de Sees Invariantes nota de licena do trabalho combinado. Na combinao, voc precisa combinar quaisquer sees entituladas "Histrico"dos diversos documentos originais, formando uma seo entitulada "Histrico"; da mesma forma combine quaisquer sees entituladas "Agradecimentos", ou "Dedicatrias". Voc precisa apagar todas as sees entituladas como "Endosso".
COLETNEAS DE DOCUMENTOS
Voc pode fazer uma coletnea consitindo do Documento e outros documentos publicados sob esta Licena, e substituir as cpias individuais desta Licena nos vrios documentos com uma nica cpia incluida na coletnea, desde que voc siga as regras desta Licena para cpia exata de cada um dos Documentos em todos os outros aspectos. Voc pode extrair um nico documento de tal coletnea, e distribu-lo individualmente sob esta Licena, desde que voc insira uma cpia desta Licena no documento extrado, e siga esta Licena em todos os outros aspectos relacionados cpia exata daquele documento.
TRADUO
Traduo considerada como um tipo de modicao, ento voc pode distribuir tradues do Documento sob os termos da seo 4. A substituio de Sees Invariantes por tradues requer uma permisso especial dos detentores do copyright das mesmas, mas voc pode incluir tradues de algumas ou de todas as Sees Invariantes em adio s verses orignais dessas Sees Invariantes. Voc pode incluir uma traduo desta Licena desde que voc tambm inclua a verso original em Ingls desta Licena. No caso de discordncia entre a traduo e a
16
CDTC
Brasil/DF
TRMINO
Voc no pode copiar, modicar, sublicenciar, ou distribuir o Documento exceto como expressamente especicado sob esta Licena. Qualquer outra tentativa de copiar, modicar, sublicenciar, ou distribuir o Documento nula, e resultar automaticamente no trmino de seus direitos sob esta Licena. Entretanto, terceiros que tenham recebido cpias, ou direitos de voc sob esta Licena no tero suas licenas terminadas, tanto quanto esses terceiros permaneam em total acordo com esta Licena.
17
CDTC
Brasil/DF
tal como a GNU General Public License, para permitir o seu uso em software livre.
18
Parte IV
Bash Bsico
19
Captulo 1
Linux est sendo uma revoluo para a computao. Ele une liberdade com conhecimento e tecnologia. De uma forma bem simples envolve e estimula o usurio a conhecer a sua prpria mquina e o seu sistema operacional. Uma das formas dessa interao entre o homem e a mquina a interface que nela contm, sendo ela o prprio terminal na forma de comandos. Assim como o DOS, o Bash um shell, ou seja, uma linguagem de comando interpretado entre o sistema operacional GNU e o usurio. executado na forma de seqncias de comandos em arquivos textos. O Bash uma espcie de tradutor entre o sistema operacional e o usurio.
20
Captulo 2
Plano de ensino
2.1 Objetivo
Capacitar o usurio para o aprendizado bsico dos comandos do Linux.
2.3 Pr-requisitos
Os usurios devero ser, necessariamente, funcionrios pblicos e ter conhecimentos bsicos para operar um computador.
2.4 Descrio
O curso ser realizado na modalidade Educao a Distncia e utilizar a Plataforma Moodle como ferramenta de aprendizagem. O curso tem durao de uma semana e possui um conjunto de atividades (lies, fruns, glossrios, questionrios e outros) que devero ser executadas de acordo com as instrues fornecidas. O material didtico est disponvel on-line de acordo com as datas pr-estabelecidas em cada tpico.
2.5 Metodologia
O curso est dividido da seguinte maneira: Lies 1 a 5; Avaliao de aprendizagem e Avaliao do curso. As lies contm o contudo principal. Elas podero ser acessadas quantas vezes forem necessrias, desde que esteja dentro da semana programada. Ao nal de uma lio, voc receber uma nota de acordo com o seu desempenho. Responda com ateno s perguntas de cada lio, 21
CDTC
Brasil/DF
pois elas sero consideradas na sua nota nal. Caso sua nota numa determinada lio for menor do que 6.0, sugerimos que voc faa novamente esta lio. Ao nal do curso ser disponibilizada a avaliao referente ao curso. Tanto as notas das lies quanto a da avaliao sero consideradas para a nota nal. Todos os mdulos caro visveis para que possam ser consultados durante a avaliao nal. Aconselhamos a leitura da "Ambientao do Moodle"para que voc conhea a plataforma de Ensino a Distncia, evitando diculdades advindas do "desconhecimento"sobre a mesma. Os instrutores estaro a sua disposio ao longo de todo curso. Qualquer dvida dever ser enviada no frum. Diariamente os monitores daro respostas e esclarecimentos.
2.6 Programa
O curso oferecer o seguinte contedo: Expresses Regulares; Ambiente Shell; Comandos de manipulao de caracteres.
2.7 Avaliao
Toda a avaliao ser feita on-line. Aspectos a serem considerados na avaliao: Iniciativa e autonomia no processo de aprendizagem e de produo de conhecimento; Capacidade de pesquisa e abordagem criativa na soluo dos problemas apresentados. Instrumentos de avaliao: Participao ativa nas atividades programadas. Avaliao ao nal do curso. O participante far vrias avaliaes referente ao contedo do curso. Para a aprovao e obteno do certicado o participante dever obter nota nal maior ou igual a 6.0 de acordo com a frmula abaixo: Nota Final = ((ML x 7) + (AF x 3)) / 10 = Mdia aritmtica das lies AF = Avaliaes
22
CDTC
Brasil/DF
2.8 Bibliograa
Site: http://aurelio.net/shell/ Site: http://www.ic.unicamp.br/ celio/mc514/bash/bash.html
23
Captulo 3
Expresses Regulares
3.1 Introduo
Uma Expresso Regular (ER) um mtodo formal de se especicar um padro de texto. uma composio de smbolos, caracteres com funes especiais, chamados "metacaracteres"que, agrupados entre si e com caracteres literais, formam uma seqncia, uma expresso. Essa expresso testada em textos e retorna sucesso caso este texto obedea exatamente a todas as suas condies. Diz-se que o texto "casou"com a expresso. A ERs servem para se dizer algo abrangente de forma especca. Denido o padro de busca, tem-se uma lista (nita ou no) de possibilidades de casamento. Em um exemplo rpido, [rgp]ato pode casar "rato", "gato"e "pato". As ERs so teis para buscar ou validar textos variveis como: data horrio nmero IP endereo de e-mail endereo de Internet declarao de uma funo () dados na coluna N de um texto dados que esto entre <tags></tags> nmero de telefone, RG, CPF, carto de crdito Vrios editores de texto e linguagens de programao tm suporte a ERs, ento o tempo investido em seu aprendizado recompensado pela larga variedade de aplicativos onde ele pode ser praticado.
CDTC
Brasil/DF
comando grep tem o seguinte formato: grep palavra arquivo Vamos utilizar como exemplo o arquivo /etc/passwd, que a base de usurios de um sistema UNIX/Linux. Vale a pena, antes, vericar como que se constitui esse arquivo dando o comando:
$cat /etc/passwd
Observa-se que sero obtidas vrias linhas, onde cada um se refere a um usurio diferente. E cada linha possui o seguinte formato:
login :
senha :
3.3 Os Metacaractres
Cada metacaracteres uma ferramenta que tem uma funo especca. Servem para dar mais poder s pesquisas, informando padres e posies imposssveis de se especicar usando somente caracteres normais. Os metacaracteres so pequenos pedacinhos simples, que agrupados entre si, ou com caracteres normais, formam algo maior, uma expresso. O importante compreender bem cada um individualmente, e depois apenas l-los em seqncia.
Metacaracteres Representantes
So aqueles cuja funo representar um ou mais caracteres. Ponto . Lista [...] Lista Negada [^...]
O ponto
O ponto nosso curinga solitrio, que est sempre procura de um casamento, no importa com quem seja. Pode ser um nmero, uma letra, um TAB, um , o que vier ele traa, pois o ponto casa qualquer coisa. Exemplos: "n.o"casaria:
CDTC
Brasil/DF
Bem mais exigente que o ponto, a lista no casa com qualquer um. Ela sabe exatamente o que quer, e nada diferente daquilo, a lista casa com quem ela conhece. Toda "lista"(os colchetes e seu contedo) vale para apenas uma posio, um caractere, por maior que seja. Exemplos: n[a]o no, nao, ... [Tt]eclado teclado, Teclado, .... 12[:. ]45 12:45, 12 45, 12.45, ... A lista de certa forma exigente. Sendo assim: Evite Prera: [0123456789] [0-9] [0-9][0-9]:[0-9][0-9] [012][0-9]:[0-5][0-9] [A-z] [A-Za-z]
Lista negada
A lista negada exatamente igual lista, podendo ter caracteres literais, intervalos e classes POSIX. Tudo o que se aplica a lista normal, se aplica negada tambm. A nica diferena que ela possui lgica inversa, ou seja, ela casar com qualquer coisa, fora os componentes listados. A nica diferena que ela possui lgica inversa, ou seja, ela casar com qualquer coisa, fora os componentes listados. Observe que a diferena em sua notao que o primeiro caractere da lista um circunexo, ele indica que esta uma lista negada. Ento se [0-9] so nmeros, [^\0-9] qualquer coisa fora nmeros. Pode ser letras, smbolos, espao em branco, qualquer coisa, menos nmeros. Porm, ao iniciar o circunexo (^) fora das chaves possui outro signicado diferente: simboliza o incio de uma linha. Mas tem de ser alguma coisa. S porque ela uma lista negada isso no signica que ela pode casar "nada". Exemplos: [A-Z^] casa maisculas e o circunexo e [^A-Z^]casa tudo fora isso. Como mandam as regras da boa escrita, sempre aps caracteres de pontuao como a vrgula ou o ponto, devemos ter um espao em branco os separando do resto do texto. Ento vamos procurar por qualquer coisa que no o espao aps a pontuao: [:;,.!?][^ ]
CDTC
Brasil/DF
asterisco * mais + chaves Opcional til para procurar palavras no singular e plural e pode ser tornar opcionais caracteres e metacaracteres. Exemplos: Expresso Casa com Ondas? Onda Ondas Senadora? Senador Senadora [BFM]?ala ala Bala Fala Mala Asterisco Pode aparecer em qualquer quantidade. O curinga .* o tudo e o nada, qualquer coisa. Exemplos: 6*0 0, 60, 660, 6660, ..., 666666666660, ... bi*p bp, bip, biip, biiip, biiiip... b[ip]* b, bi, bip, biipp, bpipipi, biiiiip ... Mais Tem funcionamento idntico ao do asterisco, tudo o que vale para um, se aplica ao outro. A nica diferena que o mais (+) no opcional, ento a entidade anterior deve casar pelo menos uma vez, e pode ter vrias. Sua utilidade quando queremos no mnimo uma repetio. Exemplos: 6+0 60, 660, 6660, ..., 666666660, ... bi+p bip, biip, biiip, biiiip... b[ip]+ bi, bip, biipp, bpipipi, biiiiip, bppp, ... Chaves As chaves so a soluo para uma quanticao mais controlada, onde se pode especicar exatamente quantas repeties se quer da entidade anterior. Colocando um nmero entre chaves " ", indica-se uma quantidade de repeties do caractere (ou metacaractere) anterior. As chaves so precisas podendo especicar um nmero exato, um mnimo, um mximo, ou uma faixa numrica. Elas, inclusive, simulam o *, + e ? . Exemplos: n,m signica de n at m vezes, assim algo como 61,4 casa 6, 66, 666 e 6666. S, nada mais que isso. 0,1 zero ou 1 (igual ao opcional) 0, zero ou mais (igual ao asterisco) 1, um ou mais (igual ao mais) 3 exatamente
27
CDTC
Brasil/DF
3.5.1
Circunexo
Este metacaractere (do tipo de posicionamento por representar uma posio especca da linha) simboliza o incio de uma linha. tambm o marcador de lista negada mas apenas dentro da lista (e no comeo), fora dela ele a ncora que marca o incio de uma linha, veja:
^[0-9]
signica que casa com uma linha comeando com qualquer algarismo. O inverso disso seria:
^[^0-9]
3.5.2
Cifro - o m
Este similar e complementar ao circunexo, pois representa o m de uma linha e s vlido no nal de uma expresso regular. Quando demos o comando: $ grep bash$ /etc/passwd signica que procuramos pela palavra "bash"no nal da linha, ou ainda, a palavra "bash"seguida de um m de linha. Esse cifro o mesmo caractere que utilizado para identicar as variveis do shell, como $PWD e $HOME. Para evitar possveis problemas com a expanso de variveis, preciso "proteger"a expresso regular passada ao grep. A proteo feita colocando-se a ER entre aspas simples fazendo: $ grep 'bash$' /etc/passwd Veja outros exemplos:
28
CDTC
Brasil/DF
[0-9]\$ - casa linhas que terminam com um nmero ^\$ - casa com linhas vazias ^.{20,60}\$ - casa com linhas que tm entre 20 e 60 caracteres
3.5.3
Borda - a limtrofe
A borda marca os limites de uma palavra, ou seja, onde ela comea e/ou termina. muito til para casar palavras exatas, e no partes de palavras. Palavra aqui um conceito que engloba apenas, ou seja, letras, nmeros e o sublinhado:
[A-Za-z0-9_]
Veja os exemplos: Veja como se comportam as ERs nas palavras dia, diafragma, radial, melodia e bom-dia!: dia - - - dia, diafragma, radial, melodia, bom-dia! \bdia - - - dia, diafragma, bom-dia! dia\b - - - dia, melodia, bom-dia! \bdia\b dia, bom-dia!
3.6
Outros metacaracteres
Vamos ver outros metacaracteres, que tm funes especcas e no relacionadas entre si, portanto no podem ser agrupados em outra classe fora a tradicional "outros". Mas ateno, isso no quer dizer que eles so inferiores, pelo contrrio, o poder das ERs multiplicado com seu uso e um mundo de possibilidades novas se abre a sua frente. So eles: escape \ ou | grupo () retrovisor /n
29
CDTC
Brasil/DF
Isto , a contrabarra (\) "escapa"qualquer metacaractere, tirando todos os seus poderes. O escape to poderoso que pode escapar a si prprio! O \ casa uma barra invertida \ literal. Ento, agora que sabemos muito sobre ERs, que tal uma expresso para casar um nmero de RG? Lembre que ele tem o formato n.nnn.nnn-n, fcil! [0-9]\.[0-9]{3}\.[0-9]{3}-[0-9] O \* = [*] = asterisco literal Ironia -> O escape escapa o escape, escapando-se a si prprio simultaneamente.
3.7.2 Ou
Para procurar por uma coisa ou outra, deve-se usar o pipe "|" e delimitar as opes com os parnteses "( )". muito comum em uma posio especca de nossa Expresso Regular (ER) termos mais de uma alternativa possvel, por exemplo, ao casar um cumprimento amistoso, podemos ter uma terminao diferente para cada parte do dia: boa-tarde|boa-noite O ou serve para esses casos em que precisamos dessas alternativas. Essa ER se l: "ou boa-tarde, ou boa-noite", ou seja "ou isso ou aquilo". Lembre que a lista tambm uma espcie de ou (|), mas apenas para uma letra, ento:
3.7.3 Grupo
Assim como artistas famosos e personalidades que conseguem arrastar multides, o grupo tem o dom de juntar vrios tipos de sujeitos em um mesmo local. Dentro de um grupo podemos ter um ou mais caracteres, metacarateres e inclusive outros grupos! Como em uma expresso matemtica, os parnteses denem um grupo, e seu contedo pode ser visto como um bloco na expresso. Todos os metacaracteres quanticadores que vimos anteriormente, podem ter seu poder ampliado pelo grupo, pois ele lhes d mais abrangncia. E o ou, pelo contrrio, tem sua abrangncia limitada pelo grupo, e pode parecer estranho, mas essa limitao que lhe d mais poder. Em um exemplo simples, (ai)+ agrupa a palavra ai e esse grupo est quanticado pelo mais (+). Isso quer dizer que casamos vrias repeties da palavra, como ai, aiai, aiaiai, ... E assim podemos agrupar tudo o que quisermos, literais e metacaracteres, e quantic-los:
30
CDTC
Brasil/DF
(ha!)+ ha!, ha!ha!, ha!ha!ha!, ... (\.[0-9]){3} .0.6.2, .2.8.9, .6.6.6, ... (www )?zz\.com www.zz.com, zz.com
E em especial nosso amigo ou ganha limites ou seu poder cresce: boa-(tarde|noite) boa-tarde, boa-noite #(|n\.|nm) 6 # 6, n. 6, nm 6 (in|con)?certo incerto, concerto, certo Podemos criar subgrupos tambm, ento imagine que voc esteja procurando o nome de um supermercado em uma listagem e no sabe se este um mercado, supermercado ou um hipermercado. (super|hiper)mercado Consegue casar as duas ltimas possibilidades, mas note que nas alternativas super e hiper temos um trecho per comum aos dois, ento podamos "alternativizar"apenas as diferenas su e hi: (su|hi)permercado Precisamos tambm casar apenas o mercado sem os aumentativos, ento temos de agruplos e torn-los opcionais: ((su|hi)per)?mercado Ei! E se tivesse minimercado tambm? (mini|(su|hi)per)?mercado
31
Captulo 4
Parte I
4.1 Dilogo
Dilogo entre ouvido um Linuxer e um empurrador de mouse: - Quem o Bash? - O Bash o lho mais novo da famlia Shell. - P cara! Ests a m de me deixar maluco? Eu tinha uma dvida e voc me deixa com duas! No, maluco voc j h muito tempo. Desde que se decidiu a usar aquele sistema operacional que voc tem que dar dez boots por dia e no tem domnio nenhum sobre o que esta acontecendo no seu computador. Mas deixa isso pr l, vou te explicar o que Shell e os componentes de sua famlia e ao nal da explanao voc dir: "Meu Deus do Shell! Porque eu no optei pelo Linux antes?".
. Neste grco d para ver que a camada de hardware a mais profunda e formada pelos componentes fsicos do seu computador. Envolvendo esta, vem a camada do kernel que o 32
CDTC
Brasil/DF
cerne do Linux, seu ncleo, quem bota o hardware para funcionar, fazendo seu gerenciamento e controle. Os programas e comandos que envolvem o kernel, dele se utilizam para realizar as tarefas aplicativas para que foram desenvolvidos. Fechando tudo isso vem o Shell que leva este nome porque em ingls, Shell signica concha, carapaa, isto , ca entre o usurio e o sistema operacional, de forma que tudo que interage com o sistema operacional, tem que passar pelo seu crivo.
33
CDTC
Brasil/DF
Desenvolvido por Bill Joy da Berkley University o Shell mais utilizado em ambientes *BSD e Xenix. A estruturao de seus comandos bem similar da linguagem C. Seu grande pecado foi ignorar a compatibilidade com o sh, partindo por um caminho prprio. Alm destes Shells existem outros, mas irei falar contigo somente sobre os trs primeiros, tratandoos genericamente por Shell e assinalando as especicidades de cada um que porventura hajam. Ateno: Quando eu disse que o ltimo campo do /etc/passwd informa ao sistema qual o Shell que o usurio vai receber ao se "logar", para ser interpretado ao p-da-letra, isto , se neste campo do seu registro estiver prog, a pessoa ao acessar o sistema receber a tela de execuo do programa prog e ao terminar a sua execuo ganhar imediatamente um logout. Imagine o quanto se pode incrementar a segurana com este simples artifcio.
Comando
Quando uma linha digitada no prompt do Linux, ela dividida em pedaos separados por espao em branco: o primeiro pedao o nome do programa que ter sua existncia pesquisada; identica em seguida, nesta ordem, opes/parmetros, redirecionamentos e variveis. Quando o programa identicado existe, o Shell verica as permisses dos arquivos envolvidos (inclusive o prprio programa), dando um erro caso voc no esteja credenciado a executar esta tarefa.
Atribuio
Se o Shell encontra dois campos separados por um sinal de igual ()= sem espaos em branco entre eles, identica esta seqncia como uma atribuio. Exemplos: 34
CDTC
Brasil/DF
$ ls linux linux
Neste exemplo o Shell identicou o ls como um programa e o linux como um parmetro passado para o programa ls.
$ valor=1000
Neste caso, por no haver espaos em branco (j d para notar que o branco um dos caracteres reservados) o Shell identicou uma atribuio e colocou 1000 na varivel valor. Jamais Faa:
Resoluo de Redirecionamentos
Aps identicar os componentes da linha que voc teclou, o Shell parte para a resoluo de redirecionamentos. O Shell tem incorporado ao seu elenco de vantagens o que chamamos de redirecionamento, que pode ser de entrada (stdin), de sada (stdout) ou dos erros (stderr), conforme vou te explicar a seguir.
Substituio de Variveis
Neste ponto, o Shell verica se as eventuais variveis (parmetros comeados por $), encontradas no escopo do comando, esto denidas e as substitui por seus valores atuais.
35
CDTC
Brasil/DF
Apstrofo ou plic ()
Quando o Shell v uma cadeia de caracteres entre apstrofos ('), ele tira os apstrofos da cadeia e no interpreta seu contedo.
$ rm *
Voc estaria fazendo a maior encrenca, pois o rm removeria todos os arquivos do diretrio corrente. A melhor forma de fazer o pretendido :
$ rm \*
Desta forma, o Shell no interpretaria o asterisco, e em conseqncia no faria a sua expanso. Faa a seguinte experincia cientca:
$ $ $ $
Aspas (")
Exatamente igual ao apstrofo exceto que, se a cadeia entre aspas contiver um cifro ($), uma crase (`), ou uma barra invertida (\), estes caracteres sero interpretados pelo Shell. No precisa se estressar, eu no te dei exemplos do uso das aspas por que voc ainda no conhece o cifro($) nem a crase (`). Daqui para frente veremos com muita constncia o uso destes 36
CDTC
Brasil/DF
$ cat
O cat uma instruo que lista o contedo do arquivo especicado para a Sada Padro (stdout). Caso a entrada no seja denida, ele espera os dados da stdin. Ora como eu no especiquei a entrada, ele est esperando-a pelo teclado (Entrada Padro) e como tambm no citei a sada, o que eu teclar ir para a tela (Sada Padro) fazendo desta forma, como eu havia proposto um programa gago. Experimente!
37
CDTC
Brasil/DF
de perder o contedo do seu querido arquivo. Com isso d para notar que o (maior maior) serve para inserir texto no nal do arquivo.
CDTC
Brasil/DF
Dica 2: - Quem esse tal de /dev/null? - Em Unix existe um arquivo fantasma. Chama-se /dev/null. Tudo que mandado para este arquivo some. Assemelha-se a um Buraco Negro. No caso do exemplo, como no me interessava guardar a possvel mensagem de erro oriunda do comando rm, redirecionei-a para este arquivo. interessante notar que estes caracteres de redirecionamento so cumulativos, isto , se no exemplo anterior zssemos:
$ ls naoexiste 2 arquivodeerros
a mensagem de erro oriunda do ls seria anexada ao nal de arquivodeerros.
$ ftp -ivn hostremoto fimftp user $Usurio $Senha binary get arquivoremoto fimftp
Neste pedacinho de programa temos um monte de detalhes interessantes: 1. As opes que usei para o ftp (-ivn) servem para ele ir listando tudo que est acontecendo (v de verbose), para no perguntar se voc tem certeza de que deseja transmitir cada arquivo 39
CDTC
Brasil/DF
(-i de interactive), e nalmente a opo -n serve para dizer ao ftp para ele no solicitar o usurio e sua senha, pois esses sero informados pela instruo especca (user); 2. Quando eu usei o mftp, estava dizendo o seguinte para o intrprete: "Olhe aqui Shell, no se meta em nada a partir daqui at encontrar o label mftp. Voc no entenderia nada, j que so instrues especcas do comando ftp e voc no entende nada de =ftp=". Se fosse s isso seria simples, mas pelo prprio exemplo d para ver que existem duas variveis ($Usurio e $Senha), que o Shell vai resolver antes do redirecionamento. Mas a grande vantagem desse tipo de construo que ela permite que comandos tambm sejam interpretados dentro do escopo do here document, o que tambm contraria o que acabei de dizer. Logo a seguir explico como esse negcio funciona. Agora ainda no d, est faltando ferramenta. 1. O comando user do repertrio de instrues do ftp e serve para passar o usurio e a senha que haviam sido lidos em uma rotina anterior a esse fragmento de cdigo e colocados respectivamente nas duas variveis: $Usurio e $Senha. 2. . O binary outra instruo do ftp, que serve para indicar que a transferncia de arquivoremoto ser feita em modo binrio, isto , o contedo do arquivo no ser interpretado para saber se est em ASCII, EBCDIC, ... 3. O get arquivoremoto diz ao ftp para pegar esse arquivo em hostremoto e traz-lo para o nosso host local. Se fosse para mandar o arquivo, usaramos o comando put. Ateno: Um erro muito freqente no uso de labels (como o mftp do exemplo anterior) causado pela presena de espaos em branco antes ou aps o mesmo. Fique muito atento quanto a isso, por que este tipo de erro costuma dar uma boa surra no programador, at que seja detectado. Lembre-se: um label que se preze tem que ter uma linha inteira s para ele. - Est bem, est bem! Eu sei que dei uma viajada e entrei pelos comandos do ftp, fugindo ao nosso assunto que Shell, mas como sempre bom aprender e raro as pessoas estarem disponveis para ensinar...
$ ls | wc -l 21
O comando ls passou a lista de arquivos para o comando wc, que quando est com a opo -l conta a quantidade de linha que recebeu. Desta forma, podemos armar categoricamente que no meu diretrio existiam 21 arquivos.
CDTC
Brasil/DF
Esta linha de comandos manda a listagem do arquivo /etc/passwd para a entrada do comando sort. Este a classica e manda-a para o lp que o gerenciador do spool de impresso.
$ who | wc -l 8
O comando who passa a lista de usurios conectados para o comando wc -l que conta quantas linhas recebeu e lista a resposta na tela. Pois bem, mas ao invs de ter um oito solto na tela, o que eu quero que ele esteja no meio de uma frase. Ora para mandar frases para a tela eu uso o comando echo, ento vamos ver como que ca:
CDTC
Brasil/DF
$ mail suporte FIM >Ola suporte, hoje as 'date"+%hh:mm"' >ocorreu novamente aquele problema >que eu havia reportado por >telefone. Conforme seu pedido >ai vai uma listagem dos arquivos >do diretorio: >'ls -l' >Abracos a todos. >FIM
Finalmente agora temos conhecimento para mostrar o que havamos conversado sobre here document. Os comandos entre crases () sero priorizados e portanto o Shell os executar antes da instruo mail. Quando o suporte receber o e-mail, ver que os comandos date e ls foram executados imediatamente antes do comando mail, recebendo ento uma fotograa do ambiente no momento em que a correspondncia foi enviada.
42
CDTC
Brasil/DF
O prompt primrio default do Shell, como vimos, o cifro ($), porm o Shell usa o conceito de prompt secundrio, ou de continuao de comando, que enviado para a tela quando h uma quebra de linha e a instruo no terminou. Esse prompt, representado por um sinal de maior (>), que vemos precedendo a partir da 2 linha do exemplo. Para nalizar e bagunar tudo, devo dizer que existe uma construo mais moderna que vem sendo utilizada como forma de priorizao de execuo de comandos, tal qual as crases (). So as construes do tipo $(cmd), onde cmd um (ou vrios) comando que ser(o) executado(s) com prioridade em seu contexto. Assim sendo, o uso de crases () ou construes do tipo $(cmd) servem para o mesmo m, porm para quem trabalha com sistemas operacionais de diversos fornecedores (multiplataforma), aconselho o uso das crases, j que o $(cmd) no foi portado para todos os sabores de Shell. Aqui dentro do Botequim, usarei ambas as formas, indistintamente. Vejamos novamente o exemplo dado para as crases sob esta nova tica:
$ echo Existem $(who | grep wc -l) usurios conectados Existem 8 usurios conectados
Veja s este caso:
$ Arqs=ls $ echo $Arqs ls Neste exemplo eu z uma atribuio (=) e executei uma instruo. O que eu queria era que a varivel $Arqs, recebesse a sada do comando ls. Como as instrues de um script so interpretadas de cima para baixo e da esquerda para a direita, a atribuio foi feita antes da execuo do ls. Para fazer o que desejamos necessrio que eu priorize a execuo deste comando em detrimento da atribuio e isto pode ser feito de qualquer uma das maneiras a seguir: $ Arqs='ls'
ou:
$ Arqs=$(ls)
Para encerrar este assunto vamos ver s mais um exemplo. Digamos que eu queira colocar dentro da varivel $Arqs a listagem longa (ls -l) de todos os arquivos comeados por arq e seguidos de um nico caractere (?). Eu deveria fazer:
$ Arqs=$(ls -l arq?)
ou:
$ Arqs='ls -l arq?'
Mas veja:
43
CDTC
Brasil/DF
$ echo $Arqs -rw-rr 1 jneves jneves 19 May 24 19:41 arq1 -rw-rr 1 jneves jneves 23 May 24 19:43 arq2 -rw-rr 1 jneves jneves 1866 Jan 22 2003 arql
- P, saiu tudo embolado! - Pois cara, como eu j te disse, se voc deixar o Shell "ver"os espaos em branco, sempre que houver diversos espaos juntos, eles sero trocados por apenas um. Para que a listagem saia bonitinha, necessrio proteger a varivel da interpretao do Shell, assim:
$ echo "$Arqs" -rw-rr 1 jneves jneves 19 May 24 19:41 arq1 -rw-rr 1 jneves jneves 23 May 24 19:43 arq2 -rw-rr 1 jneves jneves 1866 Jan 22 2003 arql
- Olhe, amigo, v treinando esses exemplos, porque, quando nos encontrarmos novamente, vou lhe explicar uma srie de instrues tpicas de programao Shell. Tchau! Ahh! S mais uma coisinha que eu ia esquecendo de lhe dizer. Em Shell, o "jogo da velha"(#) usado quando desejamos fazer um comentrio.
44
Captulo 5
Parte II
5.1 Dilogo
- Garom! Traz um "chops"e dois "pastel". O meu amigo hoje no vai beber por que ele nalmente esta sendo apresentado a um verdadeiro sistema operacional e ainda tem muita coisa a aprender! - E ento, amigo, t entendendo tudo que te expliquei at agora? - Entendendo eu t, mas no vi nada prtico nisso... - Calma rapaz, o que te falei at agora, serve como base ao que h de vir daqui pra frente. Vamos usar estas ferramentas que vimos para montar programas estruturados, que o Shell permite. Voc ver porque at na TV j teve programa chamado "O Shell o Limite". - Para comear vamos falar dos comandos da famlia grep. - grep? No conheo nenhum termo em ingls com este nome... - claro, grep um acrnimo Global Regular Expression Print, que usa expresses regulares para pesquisar a ocorrncia de cadeias de caracteres na entrada denida (se bem que h uma lenda sobre como este comando foi nomeado: no editor de textos "ed", o av do "vim", o comando usado para buscas era g/_expressao regular_/p, ou no ingls g/_re_/p.). Por falar em expresses regulares (ou regexp), o Aurlio Marinho Jargas tem todas as dicas em sua pgina (inclusive tutorias) que abordam o tema. Se voc est mesmo a m de aprender a programar em Shell, Perl, Python, ... Acho bom voc ler estes artigos para te ajudar no que est para vir. Pergunta: O grep um aplicativo para linha de comando que faz buscas no contedo dos arquivos. Aceita expresses regulares e ao utiliz-las no grep recomendado utilizar escapes " para caracteres como "*"para que o bash no o entenda como um curinga para nomes de arquivos. A denio dada est correta?
CDTC
Brasil/DF
Pesquisando na saida de comando: $ who | grep Pelegrino No 1 exemplo, o mais simples, procurei a palavra rafael em qualquer lugar do arquivo /etc/passwd. Se quisesse procur-la como um login name, isto , somente no incio dos registros deste arquivo, eu deveria fazer:
O grep pode ou no usar expresses regulares simples, porm no caso de no us-las, o fgrep melhor, por ser mais rpido; O egrep ("e"de extended, extendido) muito poderoso no uso de expresses regulares. Por ser o mais lento da famlia, s deve ser usado quando for necessria a elaborao de uma expresso regular no aceita pelo grep; O fgrep ("f"de fast, rpido, ou de "le", arquivo) como o nome diz o rapidinho da famlia, executa o servio de forma muito veloz (por vezes cerca de 30% mais veloz que o grep e 50% mais que o egrep), porm no permite o uso de expresses regulares na pesquisa. Ateno: Tudo que foi dito acima sobre velocidade, s se aplica famlia de comandos grep do Unix. No Linux o grep sempre mais veloz, j que os outros dois (fgrep e egrep) so scripts em Shell que chamam o primeiro e, j vou adiantando, no gosto nem um pouquinho desta soluo.
46
CDTC
Brasil/DF
Agora que voc j conhece as diferenas entre os membros da famlia, me diga: o que voc acha dos trs exemplos que eu dei antes das explicaes? - Eu achei que o fgrep resolveria o teu problema de forma mais veloz do que o grep. - Perfeito! T vendo que voc est atento! Est entendendo tudo que estou te explicando! Ento vamos ver mais exemplos para clarear de vez as diferenas de uso dos membros da famlia.
$ ls -l | grep '^d' drwxr-xr-x 3 root root 4096 Dec 18 2000 doc drwxr-xr-x 11 root root 4096 Jul 13 18:58 freeciv drwxr-xr-x 3 root root 4096 Oct 17 2000 gimp drwxr-xr-x 3 root root 4096 Aug 8 2000 gnome drwxr-xr-x 2 root root 4096 Aug 8 2000 idl drwxrwxr-x 14 root root 4096 Jul 13 18:58 locale drwxrwxr-x 12 root root 4096 Jan 14 2000 lyx drwxrwxr-x 3 root root 4096 Jan 17 2000 pixmaps drwxr-xr-x 3 root root 4096 Jul 2 20:30 scribus drwxrwxr-x 3 root root 4096 Jan 17 2000 sounds drwxr-xr-x 3 root root 4096 Dec 18 2000 xine
No exemplo que acabamos de ver, o circunexo (^) serviu para limitar a pesquisa primeira posio da sada do ls longo. Os apstrofos foram colocados para o Shell no "ver"o circunexo (^). Vamos ver mais um. Sabemos que as quatro primeiras posies possveis de um ls -l de um arquivo comum (arquivo comum! No diretrio, nem link, nem...) devem ser: 47
CDTC
Brasil/DF
. Assim sendo, para descobrir todos os arquivos executveis em um determinado diretrio eu deveria fazer:
$ ls -la | egrep '^-..(x|s)' -rwxr-xr-x 1 root root 2875 Jun 18 19:38 rc -rwxr-xr-x 1 root root 857 Aug 9 22:03 rc.local -rwxr-xr-x 1 root root 18453 Jul 6 17:28 rc.sysinit
Onde novamente usamos o circunexo (^) para limitar a pesquisa ao incio de cada linha, ento as linhas listadas sero as que comeam por um trao (-), seguido de qualquer coisa (o ponto quando usado como uma expresso regular signica qualquer coisa), novamente seguido de qualquer coisa, vindo a seguir um x ou um s. Obteramos o mesmo resultado se zssemos:
CDTC
Brasil/DF
ser separado por um til (~) do nome da msica. Eu quero escrever um programa que chamado musinc, que incluir registros no meu arquivo musicas. Eu passarei o contedo de cada lbum como parmetro na chamada do programa fazendo assim:
$ musinc "lbum^interprete~musica:interprete~musica:..."
Desta forma o programa musinc estar recebendo os dados de cada lbum como se fosse uma varivel. A nica diferena entre um parmetro recebido e uma varivel que os primeiros recebem nomes numricos (nome numrico ca muito esquisito, n? O que quis dizer que seus nomes so formados por um e somente um algarismo), isto $1, $2, $3, ..., $9. Vamos, antes de tudo, fazer um teste: Exemplos
$ cat teste #!/bin/bash # Programa echo "1o. echo "2o. echo "3o.
Vamos execut-lo:
$ chmod 755 teste $ teste passando parametros para testar 1o. parm -> passando 2o. parm -> parametros 3o. parm -> para
Repare que a palavra testar, que seria o quarto parmetro, no foi listada. Isto deu-se justamente porque o programa teste s listava os trs primeiros parmetros. Vamos execut-lo de outra forma:
$ teste "passando parametros"para testar 1o. parm -> passando parametros 2o. parm -> para 3o. parm -> testar
As aspas no deixaram o Shell ver o espao em branco entre as palavras e considerou-as um 49
CDTC
Brasil/DF
nico parmetro.
. Exemplos Vamos alterar o programa teste para usar as variveis que acabamos de ver. Vamos faz-lo assim:
$ cat teste #!/bin/bash # Programa para testar passagem de parametros (2a. Versao) echo O programa $0 recebeu $# parametros echo "1o. parm -> $1" echo "2o. parm -> $2" echo "3o. parm -> $3" echo Todos de uma s tacada: $*
Repare que antes das aspas eu usei uma barra invertida para o escond-las da interpretao do Shell (se no usasse as contrabarras as aspas no apareceriam). Vamos execut-lo:
$ teste passando parametros para testar O programa teste recebeu 4 parametros 1o. parm -> passando 2o. parm -> parametros 3o. parm -> para
Todos de uma s "tacada": passando parametros para testar Conforme eu disse, os parmetros recebem nmeros de 1 a 9, mas isso no signica que no posso usar mais de 9 parmetros signica somente que s posso enderear 9. Vamos testar isso: Exemplo:
$ cat teste #!/bin/bash # Programa para testar passagem de parametros (3a. Versao) echo O programa $0 recebeu $# parametros echo "11o. parm -> $11" shift echo "2o. parm -> $1"
50
CDTC
Brasil/DF
$ teste passando parametros para testar O programa teste recebeu 4 parametros que so: 11o. parm -> passando1 2o. parm -> parametros 4o. parm -> testar
Duas coisas muito interessantes neste script: 1. Para mostrar que os nomes dos parmetros variam de $1 a $9 eu z um echo $11 e o que aconteceu? O Shell interpretou como sendo $1 seguido do algarismo 1 e listou passando1; 2. O comando shift cuja sintaxe shift n, podendo o n assumir qualquer valor numrico (porm seu default 1 como no exemplo dado), despreza os n primeiros parmetros, tornando o parmetro de ordem n+1, o primeiro ou seja, o $1. Bem, agora que voc j sabe mais sobre passagem de parmetros do que eu, vamos voltar nossa "cdteca"para fazer o script de incluso de CDs no meu banco chamado musicas. O programa muito simples (como tudo em Shell) e vou list-lo para voc ver: Exemplos
No est funcional como achava que deveria car... podia ter cado melhor. Os lbuns esto fora de ordem, dicultando a pesquisa. Vamos alterar nosso script e depois test-lo novamente:
$ cat musinc
51
CDTC
Brasil/DF
Simplesmente inseri uma linha que classica o arquivo musicas dando a sada nele mesmo (para isso serve a opo -o), aps cada lbum ser anexado. Oba! Agora est legal e quase funcional. Mas ateno, no se desespere! Esta no a verso nal. O programa car muito melhor e mais amigvel, em uma nova verso que desenvolveremos aps aprendermos a adquirir os dados da tela e formatar a entrada. Exemplos Ficar listando com o comando cat no est com nada, vamos ento fazer um programa chamado muslist para listar um lbum cujo nome ser passado como parmetro:
$ muslist "lbum 2" grep: can't open 2 musicas: album 1^Artista1~Musica1:Artista2~Musica2 musicas: album 2^Artista3~Musica3:Artista4~Musica4" musicas: album 3^Artista5~Musica5:Artista6~Musica5 musicas: album 4^Artista7~Musica7:Artista8~Musica8
Que lambana! Onde est o erro? Eu tive o cuidado de colocar o parmetro passado entre 52
CDTC
Brasil/DF
aspas, para o Shell no dividi-lo em dois! , mas repare como est o grep executado:
grep $1 musicas
Mesmo colocando lbum 2 entre aspas, para que fosse encarado como um nico parmetro, quando o $1 foi passado pelo Shell para o comando grep, transformou-se em dois argumentos. Desta forma o contedo nal da linha, que o comando grep executou foi o seguinte:
$ cat muslist #!/bin/bash # Consulta CDs (versao 2) # grep -i "$1"musicas $ muslist "album 2" album2^Artista3~Musica3:Artista4~Musica4
Neste caso, usamos a opo -i do grep, que como j vimos, serve para ignorar maisculas e minsculas, e colocamos o $1 entre aspas, para que o grep continuasse a ver a cadeia de caracteres resultante da expanso da linha pelo Shell como um nico argumento de pesquisa. Agora repare que o grep localiza a cadeia pesquisada em qualquer lugar do registro, ento da forma que estamos fazendo, podemos pesquisar por lbum, por msica, por intrprete ou at por um pedao de qualquer um destes. Quando conhecermos os comandos condicionais, montaremos uma nova verso de muslist que permitir especicar por qual campo pesquisar. A voc vai me dizer: - Poxa, mas um saco ter que colocar o argumento de pesquisa entre aspas na hora de passar o nome do lbum. Esta forma no nem um pouco amigvel! 53
CDTC
Brasil/DF
- Tem razo, e por isso vou te mostrar uma outra forma de fazer o que voc pediu:
$ cat musexc #!/bin/bash # Exclui CDs (versao 1) # grep -v "$1"musicas > /tmp/mus$ $ (dois cifres juntos) mv -f /tmp/mus$ $ musicas (dois cifres juntos)
Na primeira linha mandei para /tpm/mus$ $ (dois cifres juntos) o arquivo musicas, sem os registros que atendessem a consulta feita pelo comando grep. Em seguida, movi (que, no duro, 54
CDTC
Brasil/DF
equivale a renomear) /tmp/mus$ $ (dois cifres juntos) por cima do antigo musicas. Usei o arquivo /tmp/mus$ $ (dois cifres juntos) como arquivo de trabalho, porque como j havia citado no artigo anterior, os dois cifres juntos contm o PID (Process Identication ou identicao do processo) e desta forma cada um que editar o arquivo musicas o far em um arquivo de trabalho diferente, desta forma evitando colises no uso. - A cara, estes programas que zemos at aqui esto muito primrios em virtude da falta de ferramentas que ainda temos. Mas bom, enquanto eu tomo mais um chope, voc ir para casa praticar em cima dos exemplos dados porque, eu prometo, chegaremos a desenvolver um sistema bacana para controle dos seus CDs. - Quando nos encontrarmos da prxima vez, vou te ensinar como funcionam os comandos condicionais e aprimoraremos mais um pouco estes scripts. - Por hoje chega! J falei demais e preciso molhar a palavra porque estou de goela seca! - Garom! Mais um sem colarinho!
55
Captulo 6
Parte III
6.1 Trabalhando com cadeias
Pelo ttulo acima no pense voc que vou lhe ensinar a ser carcereiro! Estou me referindo a cadeia de caracteres!
PosIni = Posio inicial PosFim = Posio final $ cat numeros 1234567890 0987654321 1234554321 9876556789 $ cut -c1-5 numeros 12345
56
CDTC
Brasil/DF
09876 12345 98765 $ cut -c-6 numeros 123456 098765 123455 987655 $ cut -c4- numeros 4567890 7654321 4554321 6556789 $ cut -c1,3,5,7,9 numeros 13579 08642 13542 97568 $ cut -c -3,5,8- numeros 1235890 0986321 1235321 9875789
Como d para ver, no duro mesmo existem quatro sintaxes distintas: na primeira (-c 1-5), eu especiquei uma faixa, na segunda (-c -6), especiquei tudo at uma posio, na terceira (-c 4-) de uma determinada posio em diante e na quarta (-c 1,3,5,7,9), determinadas posies. A ltima (-c -3,5,-8) virando os olhos foi s para mostrar que podemos misturar tudo.
CDTC
Brasil/DF
nome do album^interprete1 nome da musica1:...:interpreten nome da musican isto , o nome do lbum ser separado por um circunexo (^) do resto do registro, que formado por diversos grupos compostos pelo intrprete de cada msica do CD e a respectiva msica interpretada. Estes grupos so separados entre si por dois-pontos (:) e internamente, o nome do intrprete ser separado por um til (~) do nome da msica. Ento para pegarmos os dados referentes a todas as segundas msicas do arquivo musicas, devemos fazer:
$ cut -f2 -d: musicas |cut -f1 -d~ Artista2 Artista4 Artista6 Artista8
Para entender isso, vamos pegar a primeira linha de musicas:
Artista2~Musica2
Agora, primeiro campo do delimitador (-d) til (~) que o que nos interessa, Artista2 e o segundo Musica2. Se o raciocnio que zemos para a primeira linha for aplicado no restante do arquivo, chegaremos 58
CDTC
Brasil/DF
6.3 O comando tr
Outro comando muito interessante o tr que serve para substituir, comprimir ou remover caracteres. Sua sintaxe segue o seguinte padro:
CDTC
Brasil/DF
que tambm so reconhecidas por outros comandos e tambm na linguagem C, e cujo signicado voc ver a seguir:
$ cat confuso echo leia Programao Shell Linux do Julio Cezar Neves > livro;cat livro; pwd;ls;rm -f livro 2>/dev/null;cd ~
Eu executava o programa e ele funcionava:
$ confuso leia Programao Shell Linux do Julio Cezar Neves /home/jneves/LM confuso livro musexc musicas musinc muslist numeros
Mas nota de prova coisa sria (e nota de dlar mais ainda sorriso) ento, para entender o que o aluno havia feito, o chamei e em sua frente executei o seguinte comando:
$ tr ";" "\n" < confuso echo leia Programao Shell Linux do Julio Cezar Neves pwd cd ~ ls -l rm -f lixo 2>/dev/null
O cara cou muito desapontado, porque em 2 ou 3 segundos eu desz a gozao que ele perdera horas para fazer. Mas preste ateno! Se eu estivesse em uma mquina com Unix, eu teria feito:
60
CDTC
Brasil/DF
$ date # Hoje Sun Sep 19 14:59:54 2004 $ date # H duas semanas Sun Sep 5 10:12:33 2004
Para pegar a hora eu deveria fazer:
$ cat -ve ArqDoDOS.txt Este arquivo^M$ foi gerado pelo^M$ DOS/Rwin e foi^M$ baixado por um^M$
61
CDTC
Brasil/DF
$ cat -ve ArqDoDOS.txt Este arquivo^M$ foi gerado pelo^M$ DOS/Rwin e foi^M$ baixado por um^M$ ftp mal feito.^M$
Bem a opo -d do tr remove o caractere especicado de todo o arquivo. Desta forma eu removi os caracteres indesejados salvando em um arquivo de trabalho e posteriormente renomeei-o para a sua designao original. Obs: No Unix eu deveria fazer:
6.3.4 O Comando if
O que o nosso comando condicional if faz testar a varivel $?. Ento vamos ver a sua sintaxe:
62
CDTC
Brasil/DF
ou seja: caso comando cmd tenha sido executado com sucesso, os comandos do bloco do then (cmd1, cmd2 e cmdn) sero executados, caso contrrio, os comandos executados sero os do bloco opcional do else (cmd3, cmd4 e cmdm), terminando com um . Vamos ver na prtica como isso funciona usando um scriptizinho que serve para incluir usurios no /etc/passwd:
$ cat incusu #!/bin/bash # Verso 1 if grep ^$1 /etc/passwd then echo Usuario '$1' j existe else if useradd $1 then echo Usurio '$1' includo em /etc/passwd else echo "Problemas no cadastramento. Voc root?" fi fi
Repare que o if est testando direto o comando grep e esta a sua nalidade. Caso o if$1 seja bem sucedido, ou seja, o usurio (cujo nome est em foi encontrado em /etc/passwd, os comandos do bloco do then sero executados (neste exemplo somente o echo) e caso contrrio, as instrues do bloco do else que sero executadas, quando um novo if testa se o comando useradd foi executado a contento, criando o registro do usurio em /etc/passwd, ou no quando dar a mensagem de erro. Vejamos sua execuo, primeiramente passando um usurio j cadastrado:
$ cat incusu #!/bin/bash # Verso 2 if grep ^$1 /etc/passwd > /dev/null then echo Usuario '$1' j existe else if useradd $1
63
CDTC
Brasil/DF
then echo Usurio '$1' includo em /etc/passwd else echo "Problemas no cadastramento. Voc root?" fi fi
Agora vamos test-lo como usurio normal (no root):
$ incusu ZeNinguem ./incusu[6]: useradd: not found Problemas no cadastramento. Voc root?
Epa, aquele erro no era para acontecer! Para evitar que isso acontea devemos mandar tambm a sada de erro (strerr, lembra?) do useradd para /dev/null, cando na verso nal assim:
echo Usuario '$1' j existe else if useradd $1 2> /dev/null then echo Usurio '$1' includo em /etc/passwd else echo "Problemas no cadastramento. Voc root?" fi fi
Depois destas alteraes e de fazer um su - (me tornar root) vejamos o seu comportamento:
CDTC
Brasil/DF
# if grep "^$1$"musicas > /dev/null then echo Este lbum j est cadastrado else echo $1 musicas sort musicas -o musicas? fi
Como voc viu, uma pequena evoluo da verso anterior, assim, antes de incluir um registro (que pela verso anterior poderia ser duplicado), testamos se o registro comeava (^) e terminava ($) igual ao parmetro passado ($1). O uso do circunexo (^) no incio da cadeia e cifro ($) no m, so para testar se o parmetro passado (o lbum e seus dados) so exatamente iguais a algum registro anteriormente cadastrado e no somente igual a um pedao de algum dos registros. Vamos execut-lo passando um lbum j cadastrado:
$ musinc "album 5^Artista9~Musica9:Artista10~Musica10" $ cat musicas album1^Artista1~Musica1:Artista2~Musica2 album2^Artista3~Musica3:Artista4~Musica4 album3^Artista5~Musica5:Artista6~Musica6 album4^Artista7~Musica7:Artista8~Musica8 album5^Artista9~Musica9:Artista10~Musica10
- Como voc viu, o programa melhorou um pouquinho, mas ainda no est pronto. medida que eu for te ensinando a programar em shell, nossa CDteca ir cando cada vez melhor. - Entendi tudo que voc me explicou, mas ainda no sei como fazer um if para testar condies, ou seja o uso normal do comando. - Cara, para isso existe o comando test, ele que testa condies. O comando if testa o comando test. Mas isso est meio confuso e como j falei muito, estou precisando de uns chopes para molhar a palavra. Vamos parando por aqui e na prxima vez te explico direitinho o uso do test e de diversas outras sintaxes do if. - Falou! Acho bom mesmo porque eu tambm j t cando zonzo e assim tenho tempo para praticar esse monte de coisas que voc me falou hoje. - Para xar o que voc aprendeu, tente fazer um scriptizinho para informar se um determinado usurio, que ser passado como parmetro esta logado (arghh!) ou no. - A Chico, mais dois chopes por favor...
65
Captulo 7
Parte IV
7.1 Dilogo
- E a cara, tentou fazer o exerccio que te pedi para revigorar as idias? - Claro, que sim! Em programao, se voc no treinar, no aprende. Voc me pediu para fazer um scriptizinho para informar se um determinado usurio, que ser passado como parmetro esta logado (arghh!) ou no. Eu z o seguinte:
$ cat logado #!/bin/bash # Pesquisa se uma pessoa est logada ou no if who | grep $1 then echo $1 est logado else echo $1 no se encontra no pedao fi
- Calma rapaz! J vi que voc chegou cheio de teso, primeiro vamos pedir os nossos chopes de praxe e depois vamos ao Shell. Chico traz dois chopes, um sem colarinho! - Agora que j molhamos os nossos bicos, vamos dar uma olhadinha na execuo do seu bacalho:
$ logado jneves jneves pts/0 Oct 18 12:02 (10.2.4.144) jneves est logado
Realmente funcionou. Passei o meu login como parmetro e ele disse que eu estava logado, porm ele mandou uma linha que eu no pedi. Esta linha a sada do comando who, e para evitar que isso acontea s mand-la para o buraco negro que a esta altura voc j sabe que o /dev/null. Vejamos ento como caria:
$ cat logado #!/bin/bash # Pesquisa se uma pessoa est logada ou no (verso 2) if who | grep $1 > /dev/null then echo $1 est logado
66
CDTC
Brasil/DF
$ logado jneves jneves est logado $ logado chico chico no se encontra no pedao
Ateno: Ah, agora sim! Lembre-se desta pegadinha, a maior parte dos comandos tem uma sada padro e uma sada de erros (o grep uma das poucos excees, j que no d mensagem de erro quando no acha uma cadeia) e necessrio estarmos atentos para redirecion-las para o buraco negro quando necessrio. Bem, agora vamos mudar de assunto: na ltima vez que nos encontramos aqui no Botequim, eu estava te mostrando os comandos condicionais e, quando j estvamos de goela seca falando sobre o if, voc me perguntou como se testa condies. Vejamos ento o comando test.
. E pensa que acabou? Engano seu! Agora que vem o que voc est mais acostumado, ou seja as famosas comparaes com numricos. Veja a tabela: 67
CDTC
Brasil/DF
. Ufa! Como voc viu tem coisa pr chuchu, e como eu te disse no incio, o nosso if muito mais poderoso que o dos outros. Vamos ver em uns exemplos como isso tudo funciona, primeiramente testaremos a existncia de um diretrio: Exemplos:
68
CDTC
Brasil/DF
cad1=1 cad2=01 if test $cad1 = $cad2 then echo As variveis so iguais. else echo As variveis so diferentes. fi
Executando o fragmento de programa acima vem:
As variveis so diferentes.
Vamos agora alter-lo um pouco para que a comparao seja numrica:
cad1=1 cad2=01 if test $cad1 -eq $cad2 then echo As variveis so iguais. else echo As variveis so diferentes. fi
E vamos execut-lo novamente: As variveis so iguais.
$ Familia=felinae $ Genero=gato $ if test $Familia = canidea -a $Genero = lobo -o $Familia = felina -a $Genero = leo > then > echo Cuidado > else
69
CDTC
Brasil/DF
$ Familia=felino $ Genero=gato $ if test $Familia = felino -o $Familia = canideo -a $Genero = ona -o $Genero = lobo > then > echo Cuidado > else > echo Poe passar a mo > fi Cuidado
Obviamente a operao redundou em erro, isto foi porque a opo -a tem precedncia sobre a -o, e desta forma o que primeiro foi avaliado foi a expresso:
$Familia = canideo -a $Genero = ona Que foi avaliada como falsa, retornando o seguinte: $Familia = felino -o FALSO -o $Genero = lobo
Que resolvida vem:
$ if test \($Familia = felino -o $Familia = canideo\) -a \($Genero = ona -o $Genero = lobo\) > then > echo Cuidado
70
CDTC
Brasil/DF
VERDADEIRO -a FALSO
Para que seja VERDADEIRO o resultado duas expresses ligadas pelo conector -a necessrio que ambas sejam verdadeiras, o que no o caso do exemplo acima. Assim o resultado nal foi FALSO sendo ento o else corretamente executado. Se quisermos escolher um CD que tenha faixas de 2 artistas diferentes, nos sentimos tentados a usar um if com o conector -a, mas sempre bom lembrarmos que o bash nos d muito recursos, e isso poderia ser feito de forma muito mais simples com um nico comando grep, da seguinte maneira:
CDTC
Brasil/DF
fi cd lmb
e utilizando a nova sintaxe, vamos faz-lo assim:
. Ou seja, quando o conector E e a primeira condio verdadeira, o resultado nal pode ser VERDADEIRO ou FALSO, dependendo da segunda condio, j no conector OU, caso a primeira condio seja verdadeira, o resultado sempre ser VERDADEIRO e se a primeira for falsa, o resultado depender da segunda condio. Ora, os caras que desenvolveram o interpretador no so bobos e esto sempre tentando otimizar ao mximo os algoritmos. Portanto, no caso do conector E, a segunda condio no ser avaliada, caso a primeira seja falsa, j que o resultado ser sempre FALSO. J com o OU, a segunda ser executada somente caso a primeira seja falsa. Aproveitando disso, criaram uma forma abreviada de fazer testes. Batizaram o conector E de && e o OU de || e para ver como isso funciona, vamos us-los como teste no nosso velho exemplo de trocarmos de diretrio, que em sua ltima verso estava assim:
72
CDTC
Brasil/DF
CDTC
Brasil/DF
as Expresses Regulares, mas no podem ser confundidas com estas). A diferena de sintaxe deste para o test que acabamos de ver que esse trabalha com dois pares de colchete da seguinte forma:
[[ expresso ]]
Onde expresso uma das que constam na tabela a seguir:
$ echo $H 13 $ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora invlida Hora invlida $H=12 $ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora invlida $
Neste exemplo, testamos se o contedo da varivel $H estava compreendido entre zero e nove ([0-9]) ou (||) se estava entre dez e doze (1[0-2]), dando uma mensagem de erro caso no fosse. Exemplos: Para saber se uma varivel tem o tamanho de um e somente um caractere, faa:
$ var=a $ [[ $var == ? ]] && echo var tem um caractere var tem um caractere $ var=aa $ [[ $var == ? ]] && echo var tem um caractere $
Como voc pode imaginar, este uso de padres para comparao, aumenta muito o poderio do comando test. No incio deste papo, antes do ltimo chope, armamos que o comando if do interpretador Shell mais poderoso que o seu similar em outras linguagens. Agora que conhecemos todo o seu espectro de funes, diga-me: voc concorda ou no com esta assertiva?
CDTC
Brasil/DF
script:
if [ $opc -eq 1 ] then inclusao elif [ $opc -eq 2 ] then exclusao elif [ $opc -eq 3 ] then alteracao elif [ $opc -eq 4 ] then exit else echo Digite uma opo entre 1 e 4 fi
Neste exemplo voc viu o uso do elif com um else if, esta a sintaxe vlida e aceita, mas poderamos fazer melhor, e isto seria com o comando case, que tem a sintaxe a seguir:
case $var in padrao1) cmd1 cmd2 cmdn ;; padrao2) cmd1 cmd2 cmdn ;; padraon) cmd1 cmd2 cmdn ;; esac
Onde a varivel $var comparada aos padres padrao1, ..., padraon e caso um deles atenda, o bloco de comandos cmd1, ..., cmdn correspondente executado at encontrar um duplo ponto-evrgula (;;), quando o uxo do programa se desviar para instruo imediatamente aps o esac. Na formao dos padres, so aceitos os seguintes caracteres:
. Para mostrar como ca melhor, vamos repetir o exemplo anterior, s que desta vez usaremos o case e no o if ... elif ... else ... .
75
CDTC
Brasil/DF
case $opc in 1) inclusao ;; 2) exclusao ;; 3) alteracao ;; 4) exit ;; *) echo Digite uma opo entre 1 e 4 esac
Como voc deve ter percebido, eu usei o asterisco como a ltima opo, isto , se o asterisco atende a qualquer coisa, ento ele servir para qualquer coisa que no esteja no intervalo de 1 a 4. Outra coisa a ser notada que o duplo ponto-e-vrgula no necessrio antes do esac. Exemplos: Vamos agora fazer um script mais radical. Ele te dar bom dia, boa tarde ou boa noite dependendo da hora que for executado, mas primeiramente veja estes comandos:
$ cat boasvindas.sh #!/bin/bash # Programa bem educado que # d bom-dia, boa-tarde ou # boa-noite conforme a hora Hora=$(date +%H) case $Hora in 0? | 1[01]) echo Bom Dia ;; 1[2-7] ) echo Boa Tarde ;; esac exit
Peguei pesado, n? Que nada vamos esmiuar a resoluo caso-a-caso (ou seria case-a-case?)
0? | 1[01] - Signica zero seguido de qualquer coisa (?), ou (|) um seguido de zero ou um ( [01] ) ou seja, esta linha pegou 01, 02, ... 09, 10 e 11; 1[2-7] - Signica um seguido da lista de dois a sete, ou seja, esta linha pegou 12, 13, ... 17;
76
CDTC
Brasil/DF
* - Signica tudo que no casou com nenhum dos padres anteriores. - Cara, at agora eu falei muito e bebi pouco. Agora eu vou te passar um exerccio para voc fazer em casa e me dar a resposta da prxima vez que nos encontrarmos aqui no botequim, t legal? - T, mas antes informe ao pessoal que est acompanhando este curso conosco como eles podem te encontrar para fazer crticas, contar piada, convidar para o chope, curso ou palestra ou at mesmo para falar mal dos polticos. - fcil, meu e-mail julio.neves@gmail.com, mas pare de me embromar que eu no vou esquecer de te passar o script para fazer. o seguinte: quero que voc faa um programa que receber como parmetro o nome de um arquivo e que quando executado salvar este arquivo com o nome original seguido de um til (~) e colocar este arquivo dentro do vi (o melhor editor que se tem notcia) para ser editado. Isso para ter sempre a ltima cpia boa deste arquivo caso o cara faa alteraes indevidas. Obviamente, voc far as crticas necessrias, como vericar se foi passado um parmetro, se o arquivo passado existe, ... Enm, o que te der na telha e voc achar que deve constar do script. Deu pr entender? - Hum, hum... - Chico! Traz mais um sem colarinho que o cara aqui j est dando para entender!
77