Papo de Botequim              LINUX USERCurso de Shell ScriptPapo de Botequim - Parte IINossos personagens voltam à mesa d...
LINUX USER                  Papo de Botequim                   Quadro 1 - Listando subdiretórios                          ...
Papo de Botequim                  LINUX USER $ chmod 755 teste                          Execute o programa:               ...
LINUX USER           Papo de Botequim  Ficar listando arquivos com o                grep <cadeia de caracteres> U         ...
Upcoming SlideShare
Loading in...5
×

Curso de Shell Script 02/11

169

Published on

Nossos personagens voltam à mesa do bar para discutir expressões regulares e colocar a “mão na massa” pela primeira vez, construindo um aplicativo simples para catalogar uma coleção de CDs.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
169
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Curso de Shell Script 02/11"

  1. 1. Papo de Botequim LINUX USERCurso de Shell ScriptPapo de Botequim - Parte IINossos personagens voltam à mesa do bar para discutir expressões regulares e linhas que usavam a palavra grep, em todos os arquivos terminados em .sh.colocar a “mão na massa” pela primeira vez, construindo um aplicativo simples Como uso essa extensão para definir meus arquivos com programas em Shell,para catalogar uma coleção de CDs. POR JÚLIO CÉSAR NEVES malandramente, o que fiz foi listar as lin- has dos programas que poderia usar como exemplo do comando grep.G arçom! Traz um “chops” e dois Olha que legal! O grep aceita como “pastel”. O meu amigo hoje não entrada a saída de outro comando, redi- vai beber porque está finalmente recionado por um pipe (isso é muitosendo apresentado a um verdadeiro sis- comum em Shell e é um tremendotema operacional, e ainda tem muita acelerador da execução de coman-coisa a aprender! dos). Dessa forma, no 3° exemplo,– E então, amigo, tá entendendo o comando who listou as pessoas tudo que te expliquei até agora? “logadas” na mesma máquina que– Entendendo eu tô, mas não vi você (não se esqueça jamais: o nada prático nisso… Linux é multiusuário) e o grep foi– Calma rapaz, o que te falei até usado para verificar se o Carvalho agora serve como base ao que há estava trabalhando ou “coçando”. de vir daqui pra frente. Vamos usar O grep é um comando muito con- essas ferramentas que vimos para hecido, pois é usado com muita fre- montar programas estruturados. Você qüência. O que muitas pessoas não verá porque até na TV já teve pro- sabem é que existem três comandos na grama chamado “O Shell é o Limite”. família grep: grep, egrep e fgrep. A princi- Para começar vamos falar dos coman- pais diferenças entre os 3 são: dos da família grep • grep - Pode ou não usar expressões– Grep? Não conheço nenhum termo em $ grep franklin /etc/passwd regulares simples, porém no caso de inglês com este nome… não usá-las, o fgrep é melhor, por ser– É claro, grep é um acrônimo (sigla) Pesquisando em vários arquivos: mais rápido. para Global Regular Expression Print, • egrep (“e” de extended, estendido) - É que usa expressões regulares para $ grep grep *.sh muito poderoso no uso de expressões pesquisar a ocorrência de cadeias de regulares. Por ser o mais poderoso dos caracteres na entrada definida. Pesquisando na saída de um comando: três, só deve ser usado quando for Por falar em expressões regulares (ou necessária a elaboração de umaregexp), o Aurélio Marinho Jargas es- $ who | grep carvalho expressão regular não aceita pelo grep.creveu dois artigos [1 e 2] imperdíveis • fgrep (“f” de fast, rápido) - Como opara a Revista do Linux sobre esse No 1º exemplo, procurei a palavra nome diz, é o ligeirinho da família,assunto e também publicou um livro [3] franklin em qualquer lugar do arquivo executando o serviço de forma muitopela Editora Novatec. Acho bom você ler /etc/passwd. Se quisesse procurar um veloz (por vezes é cerca de 30% maisesses artigos, eles vão te ajudar no que nome de usuário, isto é, somente no iní- rápido que o grep e 50% mais que oestá para vir. cio dos registros desse arquivo, poderia egrep), porém não permite o uso de digitar $ grep ‘^franklin’ /etc/passwd. expressões regulares na pesquisa.Eu fico com grep,você com gripe “E para que servem o circunflexo e os –Agora que você já conhece as difer-Esse negócio de gripe é brincadeira, só apóstrofos?”, você vai me perguntar. Se enças entre os membros da família, meum pretexto para pedir umas caipirinhas. tivesse lido os artigos que mencionei, diga: o que você acha dos três exemplosEu te falei que o grep procura cadeias de saberia que o circunflexo serve para limi- que eu dei antes das explicações?caracteres dentro de uma entrada defi- tar a pesquisa ao início de cada linha e – Achei que o fgrep resolveria o teu prob-nida, mas o que vem a ser uma “entrada os apóstrofos servem para o Shell não lema mais rapidamente que o grep.definida”? Bem, existem várias formas interpretar esse circunflexo, deixando-o – Perfeito! Tô vendo que você estáde definir a entrada do comando grep. passar incólume para o comando grep. atento, entendendo tudo que estou teVeja só. Para pesquisar em um arquivo: No 2º exemplo mandei listar todas as explicando! Vamos ver mais exemplos www.linuxmagazine.com.br Setembro 2004 87
  2. 2. LINUX USER Papo de Botequim Quadro 1 - Listando subdiretórios ser explorado). – Péra aí! De onde eu vou receber os $ ls -l | grep ‘^d’ dados dos CDs? drwxr-xr-x 3 root root 4096 Dec 18 2000 doc – Vou mostrar como o programa pode drwxr-xr-x 11 root root 4096 Jul 13 18:58 freeciv receber parâmetros de quem o estiver drwxr-xr-x 3 root root 4096 Oct 17 2000 gimp executando e, em breve, ensinarei a ler drwxr-xr-x 3 root root 4096 Aug 8 2000 gnome os dados da tela ou de um arquivo. drwxr-xr-x 2 root root 4096 Aug 8 2000 idl drwxrwxr-x 14 root root 4096 Jul 13 18:58 locale Passando parâmetros drwxrwxr-x 12 root root 4096 Jan 14 2000 lyx Veja abaixo a estrutura do arquivo con- drwxrwxr-x 3 root root 4096 Jan 17 2000 pixmaps tendo a lista das músicas: drwxr-xr-x 3 root root 4096 Jul 2 20:30 scribus drwxrwxr-x 3 root root 4096 Jan 17 2000 sounds nomedoálbum^intérprete1~nomeU drwxr-xr-x 3 root root 4096 Dec 18 2000 xine damúsica1:...:intérpreten~nomeU drwxr-xr-x 3 root root 4096 Jun 19 2000 xplns damúsican para clarear de vez as diferenças de -l). Os apóstrofos foram usados para o Isto é, o nome do álbum será separado uso entre os membros da família. Shell não “ver” o circunflexo. Vamos ver por um circunflexo do resto do registro, Eu sei que em um arquivo qualquer mais um. Veja na Tabela 1 as quatro formado por diversos grupos compostosexiste um texto falando sobre Linux, só primeiras posições possíveis da saída de pelo intérprete de cada música do CD e anão tenho certeza se está escrito com L um ls -l em um arquivo comum (não é música interpretada. Estes grupos sãomaiúsculo ou minúsculo. Posso fazer diretório, nem link, nem …). separados entre si por dois pontos (:) e,uma busca de duas formas: Para descobrir todos os arquivos exe- internamente, o intérprete será separado cutáveis em um determinado diretório por um til (~) do nome da música. egrep (Linux | linux) arquivo.txt eu poderia fazer: Quero escrever um programa chamado musinc, que incluirá registros no meuou então: $ ls -la | egrep ‘^-..(x|s)’ arquivo músicas. Passarei cada álbum como parâmetro para o programa: grep [Ll]inux arquivo.txt novamente usamos o circunflexo para limitar a pesquisa ao início de cada $ musinc “álbum^interprete~UNo primeiro caso, a expressão regular linha, ou seja, listamos as linhas que musica:interprete~musica:...”complexa (Linux | linux) usa os parênte- começam por um traço (-), seguido deses para agrupar as opções e a barra ver- qualquer coisa (o ponto), novamente Desta forma, musinc estará recebendo ostical (|) é usada como um “ou” (or, em seguido de qualquer coisa, e por fim um dados de cada álbum como se fosse umainglês) lógico, isto é, estou procurando x ou um s. Obteríamos o mesmo resul- variável. A única diferença entre umLinux ou linux. tado se usássemos o comando: parâmetro recebido e uma variável é que No segundo, a expressão regular os primeiros recebem nomes numéricos[Ll]inux significa: começado por L ou l $ ls -la | grep ‘^-..[xs]’ (o que quis dizer é que seus nomes sãoseguido de inux. Como esta é uma formados somente por um algarismo,expressão simples, o grep consegue e além disso, agilizaríamos a pesquisa. isto é, $1, $2, $3, …, $9). Vamos, fazerresolvê-la, por isso é melhor usar a mais alguns testes:segunda forma, já que o egrep tornaria a A “CDteca”pesquisa mais lenta. Vamos começar a desenvolver progra- $ cat teste Outro exemplo. Para listar todos os mas! Creio que a montagem de um #!/bin/bashsubdiretórios do diretório corrente, basta banco de dados de músicas é bacana #Teste de passagem de parametrosusar o comando $ ls -l | grep ‘^d’. Veja o para efeito didático (e útil nestes tempos echo “1o. parm -> $1”resultado no Quadro 1. de downloads de arquivos MP3 e echo “2o. parm -> $2” No exemplo, o circunflexo (^) serviu queimadores de CDs). Não se esqueça echo “3o. parm -> $3”para limitar a pesquisa à primeira que, da mesma forma que vamos desen-posição da saída do ls longo (parâmetro volver um monte de programas para Agora vamos rodar esse programinha: organizar os seus CDs de música, com Tabela 1 pequenas adaptações você pode fazer o $ teste passando parametros para U mesmo para organizar os CDs de soft- testar Posição Valores possíveis 1ª - ware que vêm com a Linux Magazine e bash: teste: cannot execute 2ª r ou - outros que você compra ou queima, e 3ª w ou - disponibilizar esse banco de software Ops! Esqueci-me de tornar o script exe- 4ª x,s(suid) ou - para todos os que trabalham com você cutável. Vou fazer isso e testar nova- (o Linux é multiusuário, e como tal deve mente o programa:88 Setembro 2004 www.linuxmagazine.com.br
  3. 3. Papo de Botequim LINUX USER $ chmod 755 teste Execute o programa: inclusão de CDs no meu banco chamado $ teste passando parametros para U musicas. O programa é muito simples testar $ teste passando parametros para testar (como tudo em Shell). Veja a Listagem 1. 1o. parm -> passando O programa teste recebeu 4 U O script é simples e funcional; limito- 2o. parm -> parametros parametros me a anexar ao fim do arquivo musicas o 3o. parm -> para 1o. parm -> passando parâmetro recebido. Vamos cadastrar 3 2o. parm -> parametros álbuns para ver se funciona (para nãoRepare que a palavra testar, que seria o 3o. parm -> para ficar “enchendo lingüiça,” suponho quequarto parâmetro, não foi listada. Isso Para listar todos de uma U em cada CD só existem duas músicas):ocorreu porque o programa teste só lista “tacada” eu faco passando Uos três primeiros parâmetros recebidos. parametros para testar $ musinc “album3^Artista5UVamos executá-lo de outra forma: ~Musica5:Artista6~Musica5” Repare que antes das aspas usei uma $ musinc “album1^Artista1U $ teste “passando parametros” U barra invertida, para escondê-las da ~Musica1:Artista2~Musica2” para testar interpretação do Shell (se não usasse as $ musinc “album 2^Artista3U 1o. parm -> passando parametros contrabarras as aspas não apareceriam). ~Musica3:Artista4~Musica4” 2o. parm -> para Como disse, os parâmetros recebem 3o. parm -> testar números de 1 a 9, mas isso não significa Listando o conteúdo do arquivo musicas: que não posso usar mais de noveAs aspas não deixaram o Shell ver o parâmetros. Significa que só posso $ cat musicasespaço em branco entre as duas endereçar nove. Vamos testar isso: album3^Artista5~Musica5:Artista6Uprimeiras palavras, e elas foram consid- ~Musica6eradas como um único parâmetro. E $ cat teste album1^Artista1~Musica1:Artista2Ufalando em passagem de parâmetros, #!/bin/bash ~Musica2uma dica: veja na Tabela 2 algumas var- # Programa para testar passagem U album2^Artista3~Musica3:Artista4Uiáveis especiais. Vamos alterar o pro- de parametros (3a. Versao) ~Musica4grama teste para usar as novas variáveis: echo O programa $0 recebeu $# U parametros Podia ter ficado melhor. Os álbuns estão $ cat teste echo “11o. parm -> $11” fora de ordem, dificultando a pesquisa. #!/bin/bash shift Vamos alterar nosso script e depois testá- # Programa para testar passagem U echo “2o. parm -> $1” lo novamente. Veja a listagem 2. Sim- de parametros (2a. Versao) shift 2 plesmente inseri uma linha que classifica echo O programa $0 recebeu $# U echo “4o. parm -> $1” o arquivo musicas, redirecionando a parametros saída para ele mesmo (para isso serve a echo “1o. parm -> $1” Execute o programa: opção -o), após cada álbum ser anexado. echo “2o. parm -> $2” echo “3o. parm -> $3” $ teste passando parametros para U $ cat musicas echo Para listar todos de uma U testar album1^Artista1~Musica1:Artista2U ”tacada” eu faco $* O programa teste recebeu 4 U ~Musica2 parametros que são: albu2^Artista3~Musica3:Artista4U Listagem 1: Incluindo CDs 11o. parm -> passando1 ~Musica4 na “CDTeca” 2o. parm -> parametros album3^Artista5~Musica5:Artista6U 4o. parm -> testar ~Musica6 $ cat musinc #!/bin/bash Duas coisas muito interessantes aconte- Oba! Agora o programa está legal e # Cadastra CDs (versao 1) ceram neste script. Para mostrar que os quase funcional. Ficará muito melhor em # nomes dos parâmetros variam de $1 a $9 uma nova versão, que desenvolveremos echo $1 >> musicas digitei echo $11 e o que aconteceu? O após aprender a adquirir os dados da tela Shell interpretou como sendo $1 seguido e formatar a entrada. do algarismo 1 e listou passando1; Listagem 2 O comando shift, cuja sintaxe é shift n, Tabela 2: Variáveis especiais podendo o n assumir qualquer valor $ cat musinc Variável Significado numérico, despreza os n primeiros #!/bin/bash $0 Contém o nome do programa parâmetros, tornando o parâmetro de # Cadastra CDs (versao 2) $# Contém a quantidade de ordem n+1. parâmetros passados # Bem, agora que você já sabe sobre $* Contém o conjunto de todos os echo $1 >> musicas passagem de parâmetros, vamos voltar à parâmetros (muito parecido com $@) sort -o musicas musicas nossa “cdteca” para fazer o script de www.linuxmagazine.com.br Setembro 2004 89
  4. 4. LINUX USER Papo de Botequim Ficar listando arquivos com o grep <cadeia de caracteres> U Listagem 5 - musexccomando cat não está com nada, vamos [arq1, arq2, ..., arqn]fazer um programa chamado muslist $ cat musexcpara listar um álbum, cujo nome será O grep entendeu que deveria procurar a #!/bin/bashpassado como parâmetro. Veja o código cadeia de caracteres album nos arquivos # Exclui CDs (versao 1)na Listagem 3: 2 e musicas. Como o arquivo 2 não # Vamos executá-lo, procurando pelo existe, grep gerou o erro e, por encontrar grep -v “$1” musicas > /tmp/mus$$album 2. Como já vimos antes, para pas- a palavra album em todos os registros de mv -f /tmp/mus$$ musicassar a string album 2 é necessário pro- musicas, listou a todos.tegê-la da interpretação do Shell, para É melhor ignorarmos maiúsculas eque ele não a interprete como dois minúsculas na pesquisa. Resolveremos mando. Estamos então prontos paraparâmetros. Exemplo: os dois problemas com a Listagem 4. desenvolver o script para remover CDs Nesse caso, usamos a opção -i do grep empenados da sua “CDteca”. Veja o $ muslist “album 2” que, como já vimos, serve para ignorar código da Listagem 5. grep: can’t open 2 maiúsculas e minúsculas, e colocamos o Na primeira linha mandei para musicas: album1^Artista1~Musica1U $1 entre aspas, para que o grep continu- /tmp/mus$$ o arquivo musicas, sem os :Artista2~Musica2 asse a ver a cadeia de caracteres resul- registros que atendessem a consulta feita musicas: album2^Artista3~Musica3U tante da expansão da linha pelo Shell pelo comando grep. Em seguida, movi :Artista4~Musica4 como um único argumento de pesquisa. /tmp/mus$$ por cima do antigo musicas. musicas:album3^Artista5~Musica5U Usei o arquivo /tmp/mus$$ como arqui- :Artista6~Musica6 $ muslist “album 2” vo de trabalho porque, como já havia album2^Artista3~Musica3:Artista4U citado no artigo anterior, o $$ contém oQue lambança! Onde está o erro? Eu tive ~Musica4 PID (identificação do processo) e, dessao cuidado de colocar o parâmetro pas- forma, cada um que editar o arquivosado entre aspas para o Shell não o Agora repare que o grep localiza a musicas o fará em um arquivo de tra-dividir em dois! É, mas repare como o cadeia pesquisada em qualquer lugar do balho diferente, evitando colisões.grep está sendo executado: registro; então, da forma que estamos Os programas que fizemos até aqui fazendo, podemos pesquisar por álbum, ainda são muito simples, devido à falta grep $1 musicas por música, por intérprete e mais. de ferramentas que ainda temos. Mas é Quando conhecermos os comandos bom praticar os exemplos dados porque,Mesmo colocando álbum 2 entre aspas, condicionais, montaremos uma nova eu prometo, chegaremos a desenvolverpara que fosse encarado como um único versão de muslist que permitirá especi- um sistema bacana para controle dosparâmetro, quando o $1 foi passado pelo ficar por qual campo pesquisar. seus CDs. Na próxima vez que nosShell para o comando grep, transformou- Ah! Em um dia de verão você foi à encontrarmos, vou te ensinar como fun-se em dois argumentos. Dessa forma, o praia, esqueceu os CDs no carro, aquele cionam os comandos condicionais econteúdo da linha que o grep executou “solzinho” de 40 graus empenou seu aprimoraremos mais um pouco essesfoi o seguinte: disco favorito e agora você precisa de scripts. Por hoje chega! Já falei demais e uma ferramenta para removê-lo do estou de goela seca! Garçom! Mais um grep album 2 musicas banco de dados? Não tem problema, sem colarinho! s vamos desenvolver um script chamadoComo a sintaxe do grep é: musexc, para excluir estes CDs. INFORMAÇÕES Antes de desenvolver o “bacalho”, Listagem 3 - muslist quero te apresentar a uma opção bas- [1] http://www.revistadolinux.com.br/ed/003/ tante útil da família de comandos grep. É ferramentas.php3 $ cat muslist a opção -v, que quando usada lista todos [2] http://www.revistadolinux.com.br/ed/007/ #!/bin/bash os registros da entrada, exceto o(s) local- ereg.php3 # Consulta CDs (versao 1) izado(s) pelo comando. Exemplos: [3] http://www.aurelio.net/er/livro/ # grep $1 musicas $ grep -v “album 2” musicas album1^Artista1~Musica1:Artista2U Julio Cezar Neves é SOBRE O AUTOR Analista de Suporte de Listagem 4 ~Musica2 Sistemas desde 1969 e muslist melhorado album3^Artista5~Musica5:Artista6U trabalha com Unix ~Musica6 desde 1980, quando $ cat muslist fez parte da equipe #!/bin/bash Conforme expliquei antes, o grep do que desenvolveu o # Consulta CDs (versao 2) SOX, um sistema exemplo listou todos os registros de # operacional similar ao Unix, produzido musicas exceto o referente a album 2, pela Cobra Computadores. grep -i “$1” musicas porque atendia ao argumento do co-90 Setembro 2004 www.linuxmagazine.com.br

×