Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

apostila - shell, Notas de estudo de Engenharia Aeroespacial

Shell Script Para iniciantes

Tipologia: Notas de estudo

2013

Compartilhado em 10/09/2013

sergio-oliveira-11
sergio-oliveira-11 🇧🇷

4

(4)

22 documentos

Pré-visualização parcial do texto

Baixe apostila - shell e outras Notas de estudo em PDF para Engenharia Aeroespacial, somente na Docsity! Shell S ript para Ini iantesPiter PUNKa.k.a. Roberto Freires Batista2004 Sumário 1 Conhe endo o BaSH 41.1 Prompt, omando... . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2 Juntando omandos... . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3 Variáveis e aspas... . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.4 Redire ionando... . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.5 Um pou o de aritméti a... . . . . . . . . . . . . . . . . . . . . . . . 101.6 ...e um pou o de lógi a . . . . . . . . . . . . . . . . . . . . . . . . . 122 Programando 142.1 Separando o Joio do Trigo... . . . . . . . . . . . . . . . . . . . . . . 142.2 A estrutura de um shell s ript . . . . . . . . . . . . . . . . . . . . . 162.3 Passando parâmetros para os seus s ripts . . . . . . . . . . . . . . . 182.4 De novo! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.5 Extra! Extra! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Trabalhando om Textos 263.1 Sele ionando textos . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.2 Organizando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.3 Editando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 Aparên ia é Tudo... 384.1 O método COBOL . . . . . . . . . . . . . . . . . . . . . . . . . . . 384.2 O método riptográ o . . . . . . . . . . . . . . . . . . . . . . . . . 394.3 O bom e velho linha e oluna . . . . . . . . . . . . . . . . . . . . 414.4 O menu de bolso . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424.5 Usando Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425 Trabalhando one tado 475.1 Mandando e-mails . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.2 Tro ando arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 505.2.1 HTML... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511 Capítulo 1Conhe endo o BaSHBem-vindos ao urso de shell s ript. Vamos omeçar mostrando um pou o o nossogrande ompanheiro, o Bourne Again SHell (um tro adilho em homenagem ao riador do sh original, Steven Bourne), onhe ido também omo bash. O bash é ompatível om a sh original, assim omo a Korn Shell (ksh) e a Z Shell (zsh). Nomundo *NIX, existe uma segunda família de shells, des endente da sh, om umasintaxe razoavelmente diferente. Ex eto prova em ontrário, a sintaxe reveladaaqui é referente ao bash.A prin ipal utilidade de uma shell é fazer om que vo ê possa utilizar o sistemaopera ional. É a shell que lê e interpreta os seus omandos, e então lê os outrosprogramas ou realiza a operação soli itada (ou um mix destes dois). Sem a shell, o omputador seria muito pou o útil (vamos lembrar que alguns sistemas de janelas, omo o X Window System, são uma espé ie de shell, em que os omandos sãosubstituídos por hieroglifos, em um retorno aos tempos do Antigo Egito).Não existe vida omo nós a onhe emos fora da shell. Além das suas bor-das, vivem programas malvados e sinais ines rupulosos, ávidos pelo sangue deino entes. Mas, dentro da shell a vida é feliz, os usuários exe utam os seus o-mandos, os programadores seus ambientes de programação repletos de makes, s, auto onfs, et ... E os administradores regem todo este sistema harmni o,através de omandos abalísti os e s ripts místi os...O objetivo do urso é fazer om que vo ê onsiga riar estes s ripts e automati-zar as suas tarefas, fa ilitando a sua vida. O shell s ript é um linguagem poderosa,já que une o bash à vasta gama de utilitários presentes em um sistema *NIX. E asintaxe utilizada para o bash é extremamente simples. 4 CAPÍTULO 1. CONHECENDO O BASH 51.1 Prompt, omando...Um dos primeiros usos para a shell é ser utilizada omo me anismo de entrada esaída, nós passamos omandos para o sistema através da shell, e os omandos nosretornam suas saídas por ela. Um bom exemplo disto está logo a seguir, onde éexe utado o omando ls om a opção -la e é retornada a listagem dos arquivosdeste diretório:punkra hael:~/lala$ ls -latotal 12drwxr-xr-x 2 punk users 4096 2003-12-08 00:27 ./drwx--x--x 95 punk users 8192 2003-12-07 22:28 ../punkra hael:~/lala$Neste pequeno exemplo já podemos identi ar um grande elemento do shell, oprompt. O prompt pode ser diferente de shel l para shell e é alterado até mesmoenquanto estamos utilizado a shell, ele serve para indi ar que o sistema está prontopara re eber o próximo omando. No exemplo a ima, o prompt é: punkra hael:/lala$.Normalmente o prompt é simbolizado por um # ou $.O segundo elemento que vemos é o omando a ser exe utado. Para um urso omo este, é interessante que o aluno esteja familiarizado om alguns omandosbási os omo o ls, who, ps, et ... aso ontrário, pode ser que ele que boiando.Boa parte dos omandos a ser utilizados seguem a seguinte sintaxe: omando -opções --opções-gnu argumento1 argumento2 ... argumentoNAs partes obrigatórias aí são o omando e o argumento1 (e, dependendo do o-mando em questão, o argumento2). O restante é op ional, e é utilizado de a ordo om o efeito nal que queremos dar ao omando.1.2 Juntando omandos...A losoa *NIX é a de que devem existir vários pequenos omandos e que uniãodeles gere efeitos poderosos. Por exemplo, o ls serve para listar todos os arquivosde um determinado diretório. Mas existem alguns diretórios que possuem umaquantidade interminável de arquivos... omo /usr/bin por exemplo. Para visu-alizar todos os arquivos deste diretório iríamos pre isar de um paginador, para quepudéssemos ver uma página de ada vez...Aí é que entra a idéia de juntar os omandos, utilizando pipes nós podemosdire ionar a saída de um omando diretamente para outro: CAPÍTULO 1. CONHECENDO O BASH 6$ ls /usr/bin | lessPronto! Com o uso de um pipe (representado pelo |), redire ionamos a saídado ls para um less, que é um paginador. Poderíamos fazer algo semelhantepara des obrir quantos diretórios temos em um outro determinado diretório... porexemplo$ ls -l ~/ | grep - dNeste aso, a saída do omando ls está sendo passada ao grep. Como isto estáfun ionando? Primeiramente, é listado o diretório HOME do usuário (o HOME érepresentado por um /), todos nós sabemos que quando é utilizada a opção -l, émostrada uma listagem detalhada, em que, entre outras oisas, temos a informaçãoda natureza de um arquivo, um diretório é identi ado por um d, na primeiraposição da linha em que apare e o arquivo. É este d que estamos ontando omo omando grep.1.3 Variáveis e aspas...O prompt, que nós vimos na seção 1.1 é uma variável do sistema. Vo ê podemudar o prompt para o que vo ê quiser. Algumas pessoas gostam de olo ar onome delas no prompt, outras gostam de olo ar o nome do omputador em queelas estão trabalhando... outras ainda gostam de olo ar estes e mais zilhões deinformações, enquanto existem alguns que vivem felizes om apenas um ifrão ouum sustenido omo prompt.Podemos ver o onteúdo de uma variável om o omando e ho, que serve paramostrar alguma informação na tela, omo o onteúdo de variáveis e textos:punkra hael:~$ e ho $PS1\u\h:\w\$Por in rível que pareça, este \u\h:\w\$ é o prompt. O \u é o nome do usuário,o \h é o host (ou máquina) em que ele está, o \w serve para mostrar o diretório detrabalho e o \$ é um indi ador,  a $ quando se está usando um usuário omume tro a para # quando é o root do sistema. O  e o : são apenas um  e um :mesmo.Dar um valor para uma variável é extremamente simples, basta fazer:punkra hael:~$ PS1="umdoistrês "umdoistrês e ho $PS1umdoistrêsumdoistrês CAPÍTULO 1. CONHECENDO O BASH 9Aí estão todos os dados disponíveis sobre a máquina na qual estamos, qual osistema opera ional, qual o nome dela, qual a versão, quando foi ompilado, et ...Podemos querer endereçar ada um deles e não apenas o primeiro... para estes asos, existe omo fazer vetores em bash:umdoistrês UNAME=(`uname -a`)umdoistrês e ho ${UNAME[1℄}ra haelAtenção para o uso:1. das aspas invertidas na denição do vetor UNAME. Em bash, ada um vetoré ini ializado omo uma série de valores, separadas por espaço dentro de ().Como a saída do omando uname já é separada por espaços, basta utilizarela mesma, exe utando o omando entre `.2. das haves ao passar o elemento do vetor. Sem elas, o shell iria apresentar o onteúdo de UNAME e, ao lado, um [1℄ meio perdido.1.4 Redire ionando...Outro re urso interessante do shell é o de dire ionar a saída de um omando paraum arquivo. Por exemplo, podemos fazer:punkra hael:~$ e ho Walla > arquivo_testepunkra hael:~$ at arquivo_testeWallaOu seja, a saída do omando e ho, ao invés de apare er na tela, apare eu direta-mente no arquivo que sele ionamos após o > (arquivo_teste). Preste bastanteatenção no >, e verá que ele se pare e muito om uma seta, indi ando o uxo paraonde vai a informação.Uma pequena experiên ia:punkra hael:~$ e ho Salim > arquivo_testepunkra hael:~$ at arquivo_testeSalimPudemos ver que o > sobres reve o arquivo anterior, se ele existir. Ou seja, é umapéssima idéia para um arquivo de logs, onde devemos sempre a res entar algumainformação em um arquivo que já existe. Para fazer esse tipo de oisa, existe o omando > >, omo vemos abaixo: CAPÍTULO 1. CONHECENDO O BASH 10punkra hael:~$ at arquivo_testeSalimpunkra hael:~$ e ho slovoboda > > arquivo_testepunkra hael:~$ at arquivo_testeSalimslovobodaTa-dá! Colo amos os dados logo abaixo no nosso arquivo! Se fosse só isso, esse re- urso de redire ionar para arquivo já iria ser a oitava maravilha do mundo modernomas, omo diziam os omer iais do 1406, não é só isso!Podemos usar os sinais de < e < < omo entrada de dados também!!!punkra hael:~$ e ho "texto todo em minús ulas" > arquivo_testepunkra hael:~$ tr a-z A-Z < arquivo_testeTEXTO TODO EM MINúSCULASO omando tr, substitui uma adeia de ara teres por outra. No nosso aso, sub-stituímos as letras minús ulas a-z, pelas maiús ulas A-Z. E, omo visto, utilizamoso onteúdo do arquivo arquivo_teste omo entrada. Podemos usar também o< <, omo veremos abaixo:punkra hael:~$ sh < <EOF> at /et /passwd | grep ^root> EOFroot:x:0:0::/root:/bin/bashQuando dizemos < <EOF estamos avisando para ele usar omo entrada tudo quees revermos, até hegar um EOF (End Of File). Então, o que dissemos no omandoa ima foi: exe ute o sh, e use omo entrada para ele os dados que forem sendoes ritos até hegar um EOF. Atenção para o >, que é onhe ido omo PS2, e é osegundo prompt do shell (o PS1 a gente já sabe qual é...)1.5 Um pou o de aritméti a...Temos variáveis, redire ionamentos, atribuições... mas ainda não temos omo fazerum simples 2+2. Experimente:punkra hael:~$ 2+2-bash: 2+2: ommand not found CAPÍTULO 1. CONHECENDO O BASH 11Não é bem assim que vamos onseguir fazer nossas operações matemáti as mas,se este não é o modo de realizar, qual seria?O primeiro e mais tradi ional é o uso de alguns omandos externos, omo oexpr e o b . Podemos ver o uso dos dois logo abaixo:punkra hael:~$ expr 2 + 24punkra hael:~$ e ho 2+2 | b -l4O b é um pou o mais difí il de trabalhar, sendo que pre isamos passar a expressãomatemáti a para ele via pipe... ou via arquivo. Mas ele é muito mais poderosoque o expr, que possui algumas limitações irritantes:1. Só faz operações om inteiros e2. Não a eita a multipli ação om o *, sendo ne essário utilizar \*Uma ter eira maneira é utilizar $(()), podemos ver seu uso na linha abaixo:punkra hael:~$ e ho $((2+2))4O $(()) a eita várias operações omo: adição (+), subtração (-), divisão (/), resto(%), multipli ação (*), exponen iação(**) além de várias operações lógi as, omoE (&), OU (|), shifts (<< e >>), et ...A outra maneira é bem familiar para os usuários de BASIC, onsiste no uso do omando let:punkra hael:~$ a=1punkra hael:~$ b=2punkra hael:~$ let a=a+bpunkra hael:~$ e ho $a3Todas as operações apresentadas para o $(()) valem para o let, e várias outrasque não estão expli itadas aqui. Muita atenção que o let, ao ontrário de todosos outros omandos, não referen ia a variável por $VARIÁVEL e sim, apenas porVARIÁVEL. Cuidado para não esque er. Capítulo 2ProgramandoAinda não é a programação própriamente dita, neste apítulo iremos dar uma ráp-ida passagem pelas estruturas de iteração e seleção do bash, além de uma pin eladaem outras áreas do onhe imento ar ano. Depois de onhe er estas estruturas, va-mos olo á-las seqüen ialmente em arquivo, o resultado desse pro esso é o nossoshell s ript.2.1 Separando o Joio do Trigo...Bom, o método mais primitivo de seleção é utilizando o && e o ||, se o omandoanterior foi bem su edido, faça alguma oisa, se não foi, não faça. Isso pode serum pou o in rementado om o uso do [ (que às vezes é um link para o omandotest). Veja o exemplo abaixo:punkra hael:~$ a=1 ; b=2punkra hael:~$ [ $a = $b ℄&& e ho iguais || e ho diferentesdiferentespunkra hael:~$ [ ! $a = $b ℄&& e ho diferentes || e ho iguaisdiferentesNo primeiro veri amos se a variável a é igual à variável b e no segundo veri amoso oposto disto.Podemos utilizar uma variedade interminável de testes omo por exemplo:punkra hael:~$ [ "`ls GNUstep`" ℄&& e ho O diretório existeO diretório existepunkra hael:~$ [ "`ls GNUstepa`" ℄&& e ho O diretório existe/usr/bin/ls: GNUstepa: No su h file or dire tory14 CAPÍTULO 2. PROGRAMANDO 15punkra hael:~$ [ "`ls GNUstepa &>/dev/null`" ℄&& e ho O diretório existepunkra hael:~$punkra hael:~$ [ -e GNUstep ℄&& e ho O diretório existeO diretório existeVimos o teste utilizando um omando, um teste dando errado, um teste utilizandoo -e, um teste om um redire ionamento... isso dá para ter um breve idéia doquanto esses testes são úteis e poderosos...O próximo passo, é utlizar a trin a if...then...fi, omo vamos ver logoabaixo:punkra hael:~$ if [ "$USER" = "punk" ℄; then e ho "Oi Punk"; fiOi PunkPara quem está a ostumado a ver isto de maneira mais estruturada, podemosfazer:punkra hael:~$ sh < <EOF> if [ "$USER" = "punk" ℄; then> e ho "Oi Punk"> fi> EOFOi PunkQue é semelhante ao formato que isto terá quando apare er no seu s ript. Podemosainda olo ar alguns penduri alhos no if...then...fi, omo o else:punkra hael:~$ sh < <EOF> if [ "$USER" = "punk" ℄; then> e ho "Oi Punk"> else> e ho "Não é o Punk!"> fi> EOFOi PunkAlém do if...then...else...fi, temos outra estrutura de seleção muito inter-essante, o ase, podemos dizer que ele é uma espé ie de superif. Ele permite que omparemos uma variável om muitos valores de uma vez só... por exemplo: CAPÍTULO 2. PROGRAMANDO 16 ase $OPCAO in1)e ho "Vo ê es olheu 1";;2)e ho "Vo ê es olheu 2";;*)e ho "Vo ê não es olheu nem 1 nem 2"exit;;esa A variável OPCAO está sendo omparada om os valores 1 e 2. Caso seja es olhidauma destas opções, o omando e ho irá mostrar na tela a opção es olhida. Senão for nem 1 e nem 2, será apresentada a mensagem Vo ê não es olheu nem1 nem 2. É isso que quer dizer aquele *: qualquer opção que não seja nenhumadas anteriores.Mas a estrutura do ase é muito omprida... a ho que já está na hora depassarmos a es rever estes omandos dentro de algum arquivo.... o resultado dissoserão os nossos shell s ripts propriamente ditos.2.2 A estrutura de um shell s riptPrimeiro, abra o seu editor de textos favorito (VIm! VIm! VIm!), ou talvez, seo seu editor favorito não estiver disponível, algum outro (elVIs! elVIs! elVIs!).O que interessa é que vo ê saiba editar um texto nele. Agora vamos omeçar deverdade...Em todo shell s ript, a primeira linha deve ser:#!/bin/shOnde o /bin/sh é a shell utilizada para interpretar o s ript. Por exemplo, sevo ê estiver om um sh s ript e quiser rodar no bash, o sh s ript deverá ter naprimeira linha algo do tipo:#!/bin/ shComo todos os nossos s ripts são ompatíveis om o bash, utilize /bin/bash ou/bin/sh (que na maior parte dos Linux é um link para o /bin/bash). Depois desta CAPÍTULO 2. PROGRAMANDO 19s ripts de manutenção, é passar os argumentos diretamente na linha de omando,por exemplo:punkra hael:~$ ./meus riptOs argumentos são:punkra hael:~$ ./meus ript um dois três quatroOs argumentos são: um dois três quatroO bash forne e várias maneiras de dete tarmos em um s ript quais são os argu-mentos, quantos são e omo endereçar ada um deles, o ódigo do meus ript, estálistado logo abaixo:#!/bin/she ho Os argumentos são: $Ou seja, om isso nós já aprendemos que o $ mostra todos os argumentos danossa linha de omando. Algumas outras variáveis úteis podem ser vistas na novaversão do meus ript.#!/bin/she ho Vo ê está exe utando o $0e ho Foram passados $# argumentos para o s ripte ho Os argumentos são: $e ho O primeiro deles é o $1A ho que o s ript em si não pre isa de muitas expli ações, veja o resultado daexe ução dele:punkra hael:~$ ./meus ript um dois tres quatroVo ê está exe utando o ./meus riptForam passados 4 argumentos para o s riptOs argumentos são: um dois tres quatroO primeiro deles é o umA expli ação rápida é: • $# - Quantidade de argumentos passados na linha de omando • $ - Lista om os argumentos passados na linha de omando • $0- Comando exe utado • $1, $2, $3, et ... - Primeiro, Segundo, Ter eiro, et ... argumento CAPÍTULO 2. PROGRAMANDO 20Podemos agora até fazer um s ript que só a eite ser exe utado se houverem argu-mentos:#!/bin/shif ! [ "$#" = "0" ℄; thene ho Vo ê está exe utando o $0e ho Foram passados $# argumentos para o s ripte ho Os argumentos são: $e ho O primeiro deles é o $1else e ho Múmia! Pre isa de um argumento!fiEsta é a nossa versão nal do meus ript. Agora ele só exe uta se a quantidadede argumentos for diferente de 0. E, aso não haja nenhum argumento devolve aousuário uma mensagem de erro edu ada e expli ativa.2.4 De novo!Além das estruturas de seleção, outras muito importantes para um programa sãoas estruturas de iteração. Elas fazem om que um determinado pedaço do ódigoseja repetido durante uma quantidade x de vezes (onde essa quantidade x podeser uma quantidade innita).O primeiro método a ser utilizado é o for. Com ele nós podemos passar poruma série de elementos em uma lista. A sintaxe dele é:for variavel in lista; do omando1 omando2... omandoNdoneOnde lista, são várias opções separadas por espaços, tabs, ou newlines. Paratermos uma idéia de omo isso fun iona, podemos fazer o seguinte:#!/bin/shfor i in `ls /tmp`; doe ho En ontrado o arquivo $idone CAPÍTULO 2. PROGRAMANDO 21O que isso irá fazer? Primeiramente, será exe utado o ls /tmp (lembre que vimosque para passar o resultado de um omando para uma variável, usamos VARI-AVEL=` omando`, neste aso, estamos passando o resultado do omando omolista para o for).Depois de exe utado ls /tmp, será exe utado o for, sendo que a variável iirá assumindo o valor de ada elemento da lista, um por vez. Com isso, podemosver que o for do sh não está limitado a utilizar apenas números, podendo usarqualquer oisa omo índi e. Bastando para isso olo ar em uma lista os valoresque queremos que i assuma, podemos usar o s ript abaixo omo exemplo:#!/bin/she ho "Os vertebrados se dividem em:"for i in Mamíferos Aves Reptéis Anfíbios Peixes; doe ho -e "\tClasse $i"doneA saída dele é:punkra hael:~$ ./vertebradosOs vertebrados se dividem em:Classe MamíferosClasse AvesClasse ReptéisClasse AnfíbiosClasse PeixesAgora vem a grande dúvida: e para usar o for ontando um número x de vezes?Isso é razoavelmente fá il. A primeira opção é bem simples:for i in 1 2 3 4 5 6 7 8 9 10; doe ho $idonePronto! Isso irá ontar de 1 a 10. O pro edimento é realmente simples... ontantoque sejam pou os os números. Se forem mais, podemos usar omo auxiliar diretoo omando seq. Veja o resultado dele na linha de omando:punkra hael:~$ seq 1 512345punkra hael:~$ CAPÍTULO 2. PROGRAMANDO 24fun tion nome_da_fun ao { omando1 omando2... omandoN}Ou nome_da_fun ao() { omando1 omando2... omandoN}Os dois métodos são equivalentes. É apenas uma questão de gosto preferir umou o outro. É sempre bom lembrar que as funções devem estar todas de laradasantes de serem hamadas. Ou seja, normalmente olo amos elas no omeço doprograma. Podemos ver a de laração e o uso de funções no nosso exemplo:#!/bin/shfun tion fun ao1 {e ho Vo ê hamou a função 1 om o argumento $1e ho E o seu login é $USER}fun ao2() {e ho Vo ê hamou a função 2 om o argumento $1e ho E o seu home é $HOME}fun ao1 argumento1read -n1 -p "Qualquer te la para ontinuar"fun ao2 argumento2Temos aí duas funções, ada uma de larada de uma maneira. Atenção para ométodo omo são passados os argumentos para a função. Eles são endereçados damesma maneira que para um novo s ript, o primeiro argumento é $1, o segundoé $2, o ter eiro é $3 e por aí vai... Este foi o nosso tutorial ultra-rápido de omoutilizar funções.O segundo omando que julgo muito importante passar, é o trap. Ele onsegue apturar alguns dos sinais para matar o seu programa. E qual a utilidade disso? CAPÍTULO 2. PROGRAMANDO 25Uma delas é fazer om que o seu programa não saia om um simples CTRL+C, aoutra, é fazer om que ele saia, mas antes disso oloque a asa em ordem.Normalmente, a medida que um programa vai sendo exe utado ele vai riandoarquivos temporários, arquivos de lo k, arquivos de trabalho, diretórios estranhos,et ... e não se pode deixar todo esse monte de tralhas entupindo o sistema. Algumahora a asa ai. Por isso é omum utilizarmos o omando trap em onjunto omuma função para a limpeza do sistema. Algo do tipo: leanup() {rm -rf /tmp/arquivo.tmp /tmp/arquivo2.tmp}trap ' leanup' 2 15Isso irá fazer om que o seu s ript inter epte os sinais 2 e 15 (SIGINT e SIGTERM).Quando um destes dois sinais hegar, será exe utada a função leanup que vailimpar as sujeiras que o seu s ript deixa no sistema. Fe hamos o apítulo om have de ouro -:) Não é sempre que onseguimos um exemplo didáti o e útil aomesmo tempo -:) Capítulo 3Trabalhando om TextosUm dos prin ipais usos de um shell s ript é no trabalho om textos. Desde osprimórdios do UNIX, foram riadas várias ferramentas para manipulação de textose strings e essas ferramentas foram algumas das responsáveis pela disseminaçãodo sistema opera ional. Como nós já dissemos anteriormente, a losoa *NIX é ade diversos pequenos utilitários, ada um realizando bem uma tarefa, trabalhandounidos, para atingir o melhor resultado.Neste apítulo faremos um uso intensivo destes pequenos utilitários e de pipes,para passar a saída de um destes omandos para outro. Como já é omum, nãoiremos esgotar ada omando, mostrando todas as opções, iremos apenas daruma apresentação e suas prin ipais opções.3.1 Sele ionando textosConseguir lo alizar os textos que nos interessam no meio de dezenas de arquivosé algo importante. Para isso existe o omando grep, om ele é possível pro urarum determinado padrão em um arquivo, ou na saída de um omando (passada viapipe). Por exemplo:punkra hael:~$ freetotal used free shared buffers a hedMem: 256148 237784 18364 0 19200 136848-/+ buffers/ a he: 81736 174412Swap: 265032 72 264960O omando free mostra a quantidade de memória utilizada pelo sistema, omvários detalhes. Agora, vamos supor que quiséssemos ver apenas a linha em queé mostrado o uso da memória swap, omo fazer? O omando grep resolve oproblema: 26 CAPÍTULO 3. TRABALHANDO COM TEXTOS 29A nossa expressão é: (100|[7-9℄[0-9℄)%, ou seja o número 100 ou algo entre 70 e99 e, em seguinda o símbolo de por entagem. O que é exatamente o que queremos100% ou 70 a 99%. Os \ são um pequeno detalhe, pequeno e desagradável.Apesar das expressões regulares em si serem razoavelmente padronizadas, alguns omandos já utilizavam os símbolos para outra oisa ou (às vezes) o próprio shelltem algum outro uso para os omandos indi ados. Daí vem o uso dos \, para fazer om que alguns ara teres sejam interpretados da maneira orreta. O lado ruim,é que ada omando utiliza os \ para ara teres diferentes, assim, o que pre isa deum \ no grep, pode não pre isar no sed ou no awk e vi e-versa. O jeito é de orarou apelar para a tentativa e erro.Um último retoque na nossa expressão: uma máquina pode ter sistemas dearquivos lo ais e remotos, e os sistemas de arquivos remotos geralmente são geren- iados pela máquina remota (e mesmo que não fossem, quem tem que uidar dissoé o administrador da outra máquina e não vo ê), os sistemas de arquivo lo ais omeçam om aquele /dev, vamos garantir que outros sistemas de arquivo nãoatrapalhem a nossa pobre vida:punkra hael:~$ df | grep '^/dev.*\(100\|[7-9℄[0-9℄\)%'/dev/hda6 2038472 1474756 458492 77% /usr/dev/hda7 2038472 1569020 364228 82% /optIn luímos o ^/dev.* que engloba toda linha que omeçar om /dev e for seguidade zero ou mais ara teres (quaisquer ara teres, em qualquer quantidade). Fi oubom, não a ham?Outro passo importante de se sele ionar um texto é onseguir apturar apenaso que for interessante no texto, o que às vezes não é toda a saída forne ida pelogrep. Por exemplo, naquele omando que demos para lo alizar em quais arquivoshavia a string 192.168.0.2. A saída era a seguinte:punkra hael:/et $ grep -r "192.168.0.2" * 2>/dev/nullhosts:192.168.0.2 ra hael.mylab ra haelr .d/r .inet1. onf:IPADDR[0℄="192.168.0.2"resolv. onf:nameserver 192.168.0.2Mas, a informação que queríamos era em quais arquivos existem essa string. Nasaída do grep, os arquivos são o pedaço anterior aos :, e isso que queremos. Parater a esso a esta informação, vamos utilizar o omando ut:punkra hael:/et $ grep -r "192.168.0.2" * 2>/dev/null | \ ut -f1 -d:hostsr .d/r .inet1. onfresolv. onf CAPÍTULO 3. TRABALHANDO COM TEXTOS 30A sintaxe do ut é extremamente simples: ut -f ampo -ddelimitadorNo nosso aso, queremos o primeiro ampo (-f1) separados por : (-d:). Para ontinuar o nosso treinamento, algo um pou o mais ompli ado, vamos tentarsele ionar, na saída do omando if onfig, o IP da nossa máquina:punkra hael:~$ /sbin/if onfig eth0eth0 Link en ap:Ethernet HWaddr 00:50:BF:67:88:97inet addr:192.168.0.2 B ast:192.168.0.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metri :1RX pa kets:141120 errors:0 dropped:0 overruns:0 frame:0TX pa kets:243521 errors:0 dropped:0 overruns:0 arrier:0 ollisions:4479 txqueuelen:100RX bytes:15819409 (15.0 Mb) TX bytes:84671582 (80.7 Mb)Interrupt:10 Base address:0xa000O primeiro passo, é sele ionar a linha em que se en ontra o IP, podemos apturá-lautilizando omo padrão o inet addr:punkra hael:~$ /sbin/if onfig eth0 | grep "inet addr"inet addr:192.168.0.2 B ast:192.168.0.255 Mask:255.255.255.0Depois disso, o nosso próximo passo é sele ionar a parte do omando que ontémo IP. Para isso, vamos separar o segundo ampo delimitado por :.punkra hael:~$ /sbin/if onfig eth0 | grep "inet addr" | \ ut -f2 -d:192.168.0.2 B astE, nosso último passo, é separar o primeiro ampo, delimitado por um espaço embran o:punkra hael:~$ /sbin/if onfig eth0 | grep "inet addr" | \ ut -f2 -d: | ut -f1 -d' '192.168.0.2Pronto! Já temos o nosso IP (e agora vo ês já sabem omo fazer para sele ionarapenas o IP da sua máquina dentro de um s ript), mais um exemplo de exemploútil! CAPÍTULO 3. TRABALHANDO COM TEXTOS 313.2 OrganizandoJá onseguimos sele ionar exatamente o que queremos na saída de um omando(ou diretamente de um arquivo: no aso do grep, ele a eita o nome do arquivona própria linha de omando e, mesmo que não a eitasse, poderíamos passar o onteúdo do arquivo utilizando o omando at). Mas, podemos pre isar de umapequena ajuda para olo ar as oisas em ordem.O omando ps, serve para mostrar quais os pro essos estão sendo exe utadospelo sistema. Além do nome dos pro essos em si, ele apresenta várias outrasinformações:punkra hael:~$ ps -edf | grep bashpunk 924 923 0 17:22 pts/1 00:00:00 -bashpunk 1110 1109 0 17:42 pts/2 00:00:00 -bashpunk 1196 1195 0 18:11 pts/0 00:00:00 -bashpunk 1350 1349 0 18:28 pts/3 00:00:00 -bashNa primeira oluna temos o usuário dono do pro esso, depois do PID dele (é umnúmero que identi a o pro esso no sistema), depois o PPID (Parent PID, que é oPID do pro esso pai deste pro esso), o uso da CPU, a hora em que foi ini iadoe outras informações, nalizando om o nome do pro esso.Podemos utilizar ps -edo user, para mostrar apenas a oluna om o nomedo usuário, de todos os pro essos exe utados na máquina... porém, a saída desse omando é enorme:punkra hael:~$ ps -edo user | w -l76O w -l serve para ontar a quantidade de linhas que tem um arquivo (e, no nosso aso, a saída do ps), a saída  a deste tamanho porque normalmente, estão sendoexe utados dezenas de pro essos em uma máquina. E pior, um úni o usuário podeser responsável por algumas dezenas destes pro essos...Mas, omo foi dito, o omando ps -edo user mostra apenas a lista om onome do usuário responsável por ada pro esso, ou seja, no nal das ontas quer-emos apenas uma lista om o nome dos usuários, sem repetições. Para nós nãoestá interessando quantos pro essos um determinado usuário está exe utando, nosinteressa se o usuário está ou não exe utando um pro esso e, se estiver, queremoso nome dele.Podemos diminuir muito esse problema om o uso do omando uniq, ele eliminaas linhas repetidas de uma saída, podemos então usar: CAPÍTULO 3. TRABALHANDO COM TEXTOS 34punkra hael:~$ free | awk '/Swap/'Swap: 265032 72 264960Neste primeiro aso, utilizamos o awk omo se fosse o omando grep. Ele apenasimprimiu a linha que asou om o padrão dado. Da mesma maneira que om ogrep, podemos utilizar expressões regulares omo padrão a ser en ontrado:punkra hael:~$ df | awk '/\/dev.*(100|[7-9℄[0-9℄)%/'/dev/hda6 2038472 1474756 458492 77% /usr/dev/hda7 2038472 1569020 364228 82% /optCom a vantagem que diminuímos muito o uso do \ (lembra quando eu falei que ada omando pre isava do \ em lo ais diferentes?). Uma grande vantagem doawk em relação ao grep é a existên ia do ampo ação, om ele podemos fazer oawk realizar oisas diferentes para ada tipo de padrão en ontrado:punkra hael:~$ df | awk '> /^\/dev.*(100|[7-9℄[0-9℄)%/ {> print "A partição "$1" está om "$5" de o upação"> }'A partição /dev/hda6 está om 77% de o upaçãoA partição /dev/hda7 está om 82% de o upaçãoNeste nosso novo omando, quando en ontramos o padrão desejado, imprimimosuma mensagem espe ial, o $1 e o $5 se referem à ampos separados por espaçosou tabulações. Juntamos o grep e o ut em um só omando -:) Podemos usar oawk omo sendo o ut, veja:punkra hael:/et $ grep -r "192.168.0.2" * 2>/dev/null | \awk -F: '{ print $1 }'hostsr .d/r .inet1. onfresolv. onfO -F: dene o delimitador a ser utilizado, omo o -d do omando ut. Para falara verdade, é possível umprir as funções de muitos outros omandos om o awke, in lusive, riar novos. Vamos riar o nosso s ript mem, em seu editor favoritoes reva:#!/bin/shfree | awk 'BEGIN { CAPÍTULO 3. TRABALHANDO COM TEXTOS 35print "Memória"}/Mem:/ {print "\tTotal: "$2"\tBuffers: "$6"\tCa heada: "$7}/-\/+/ {print "\tUsada: "$3"\tLivre: "$4}'O que faz este nosso programa? Ele pega a saída do omando free e a transformaem algo um pou o mais inteligível, torne-o exe utável e veja o que a onte e quandoé hamado:punkra hael:~$ memMemória Total: 256148 Buffers: 22596 Ca heada: 134012Usada: 91136 Livre: 165012Com isso a aba a famosa onfusão em que o indivíduo a ha que o Linux estáusando toda a memória dele, ulpa dos ampos used e free que apare em nasaída do omando free. No aso do nosso awk a úni a novidade é o BEGIN, narealidade ele é um tipo de padrão espe ial que é exe utado no iní io do programa.Outro padrão semelhante é o END, que sempre é exe utado após todas as linhashaverem sido pro essadas.3.3 EditandoAlém de a har uma informação e formatá-la da maneira que a har mais agradável,uma ne essidade razoável é alterar o onteúdo de um arquivo. Vamos tomar omoexemplo o /et /hosts que lista alguns IPs e nomes (normalmente os úni os IPsali são o do lo alhost e o da sua máquina, os outros ostumam estar sob respons-abilidade de um DNS):punkra hael:~$ at /et /hosts | grep -v "^#\|^$"127.0.0.1 lo alhost192.168.0.2 ra hael.mylab ra haelO grep ali faz om que todas as linhas de omentário (^#) e todas as linhas vazias(^$) não sejam mostradas, sendo mostrado apenas o que nos interessa. Podeser ne essário alterar o IP da nossa máquina, e isso iremos fazer om auxílio do omando sed: CAPÍTULO 3. TRABALHANDO COM TEXTOS 36punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \> sed -e "s/192.168.0.2/192.168.0.100/"127.0.0.1 lo alhost192.168.0.100 ra hael.mylab ra haelVejam que onde estava 192.168.0.2 foi tro ado para 192.168.0.100. Isso é feitopelo argumento entre aspas do sed.s/192.168.0.2/192.168.0.100/ quer dizer: substitua onde está 192.168.0.2por 192.168.0.100. Poderíamos fazer isso om o nome do omputador também(onde está ra hael):punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \> sed -e "s/ra hael/pris/"127.0.0.1 lo alhost192.168.0.2 pris.mylab ra haelOh! oh! Algo deu errado! Ele tro ou apenas o primeiro ra hael da linha, deixou osegundo lá, into ado. Mas é assim que o sed fun iona, o padrão é tro ar apenas aprimeira o orrên ia dentro de uma linha e depois pro urar outra linha. Para mudarisso, pre isamos indi ar o que deve alterar todas as o orrên ias que en ontrar, issoé feito olo ando um g no nal do padrão:punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \> sed -e "s/ra hael/pris/g"127.0.0.1 lo alhost192.168.0.2 pris.mylab prisPronto! Agora tudo está orreto, mudamos o nome da nossa máquina para pris(para quem não sabe, pris e ra hael são Repli antes do lme Blade Runner).Podemos agora mudar o nome e o IP ao mesmo tempo:punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \sed -e "s/ra hael/pris/g" -e "s/192.168.0.2/192.168.0.100/"127.0.0.1 lo alhost192.168.0.100 pris.mylab prisVamos aproveitar e aprender mais uma sobre o sed, faça:punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \sed -e "s/ra hael/pris/g" -e "s/192.168.0.2/192.168.0.100/" \-e "/127.0.0.1/d"192.168.0.100 pris.mylab pris CAPÍTULO 4. APARÊNCIA É TUDO... 39 anto superior esquerdo da tela e um gigantes o espaço em bran o (ou, na maioriadas vezes, em negro)Para ilustrar este método, zemos um pequeno s ript om apenas um tre hoda tela, podemos vê-lo na seqüên ia:#!/bin/sh at < <EOF=============================================| || Demonstração Mané do Método COBOL || || Montamos a tela inteira e depois || imprimimos om um at || |=============================================EOFE, o efeito do s ript depois de exe utado é este:punkra hael:~$ ./teste=============================================| || Demonstração Mané do Método COBOL || || Montamos a tela inteira e depois || imprimimos om um at || |=============================================Idênti o ao desenhado. O que serve omo uma prova da e iên ia deste método.4.2 O método riptográ oEnquanto o método COBOL requer muita força bruta e é extremamente legível,este método requer menos força bruta, mas a sua leitura está além da apa idadedos mortais. O texto é todo impresso através de ara teres de ontrole:punkra hael:~$ e ho -e "\n\t\tMenu de Opções\n\n\t\t\1)Opção 1\n\n\t\t2)Opção 2\n\n\t\t3)Sair\n\n\tEs olha \a opção desejada: \ " ; read -n1 OPCAO CAPÍTULO 4. APARÊNCIA É TUDO... 40A linha anterior é um bom exemplo desta té ni a. O -e do e ho, faz om que os ódigos de ontrole sejam exe utados. O \n faz um salto para o iní io da próximalinha, e o \t é uma tabulação. Enquanto o \ avisa para que o e ho não salteuma linha. Para se ter uma idéia do quê a onte e, o resultado é este:Menu de Opções1)Opção 12)Opção 23)SairEs olha a opção desejada:Apesar de um programa inteiro utilizando estes ara teres  ar bem enfadonho (eeles terem a mesma limitação das telas desenhadas em nossa era de terminais omdimensões variáveis), este método é muito onveniente para algumas mensagensde progresso, ou para se es rever logs om uma formatação agradável. O s riptabaixo mostra um uso deste método (desta vez, para saber o resultado, vai ter quees rever e rodar o s ript):#!/bin/shif [ "$#" = "0" ℄; thene ho -e "\nPor favor, utilize:\n\n\t# $0 <arquivo>\n"else e ho -e "\nPro urando por $1\t\t\ "ACHEI=`find ./ -name "$1" 2>/dev/null`if [ "$ACHEI" != "" ℄; thene ho -e "Lo alizado $ACHEI"else e ho -e "\tFALHOU"fie hofiAtravés dos ódigos podemos também es rever textos oloridos, já que existem ódigos de ontrole espe iais para olo armos um pou o de or em nossos s ripts.Mensagens de erro em vermelho ostumam  ar bem hamativas.A sintaxe para isso não é tão ompli ada quanto pare e à primeira vista:punkra hael:~/s ripts$ e ho -e "\033[37;44;1mBran o no \fundo azul\033[0m" CAPÍTULO 4. APARÊNCIA É TUDO... 41O \033[ é o ódigo da te la ESC, depois vêm outros atributos, os que vão do 30 ao37 se referem à or de frente, os do 40 ao 47 se referem à or de fundo e o 1m e 0m,se referem à or em modo bold (negrito) ou normal. No Bash-Prompt-HOWTOtem um programa mostrando os ódigos e suas respe tivas ores. E várias outrasmaneiras de se usar ara teres de ontrole.4.3 O bom e velho linha e olunaUma abordagem bem tradi ional, e bem exível. Podemos simplesmente posi- ionar o ursor onde quisermos na tela, basta indi ar qual a linha e a oluna emque ele deve estar. A partir dali, omeçamos a es rever.Por exemplo:punkra hael:~$ lear; tput up 10 40; e ho "oi"Irá es rever oi aproximadamente no entro da tela. E logo em seguida apare eo prompt, Mas podemos melhorar um pou o isso, temos omo saber exatamentequantas linhas tem a tela:punkra hael:~$ tput lines24De modo análogo, temos omo saber a quantidade de olunas om o tput ols.Voltando ao nosso maravilhoso texto oi e ao prompt que insiste a apare er nomeio da tela... Basta depois de es revermos o oi, mandarmos o ursor para onal da tela:punkra hael:~$ lear; tput up 10 40; e ho "oi"; tput up 24 0E pronto! Agora temos o nosso oi solitário no meio da tela e o prompt lá embaixo. Mas essas funções de saber a quantidade de linhas e olunas podem teroutra importân ia, através delas é possível dimensionar as nossas telas para otamanho de tela do terminal de nossos usuários, e dar uma aparên ia bem maisinteressante, abusando de entralizações e menus propor ionais... entraliza() {TAM=`expr length "$1"`COLS=`tput ols`COLUNA=$(((COLS-TAM)/2))LINHA=$2tput up $LINHA $COLUNAe ho $1} CAPÍTULO 4. APARÊNCIA É TUDO... 44dialog --yesno "Vo ê deseja apagar tudo?" 0 0Neste aso surge um novo problema... omo saber o que o seu usuário respondeu?No aso do --yesno, ele devolve "0" para sim (su esso) e "1" para não (fra asso), omo a maior parte dos omandos do bash. Um programinha om a pergunta e a apa idade de re eber a resposta seria semelhante a este:dialog --yesno "Vo ê deseja apagar tudo?" 0 0if [ $? = 0 ℄; thendialog --infobox "Apagando tudo..." 0 0elsedialog --infobox "A vida ontinua..." 0 0fiCom isso aprendemos a pegar os resultados do --yesno e de quebra aprendemosa usar uma --infobox -;)Depois de duas opções, que tal tentar om mais? A aixa --menu serve paraisso, ela vai apresentar um menu (!!!). É um pou o mais ompli ada que os outrasque vimos até agora, tendo muito mais parâmetros:dialog --menu "Sele ione uma opção do menu" 0 0 3 \1 "Opção 1" \2 "Opção 2" \3 "Opção 3"A primeira alteração visível, é que a parte do tamanho possui 3 argumentos aoinvés de dois, os dois primeiros são os já onhe idos altura e largura, e o último éo tamanho da "lista" de opções.Se vo ê olo ar o tamanho da janela da lista menor que a quantidade de opçõesexistentes, vo ê poderá "rolar" pelas opções (irá apare er um indi ador "v(+)" ou"^(+)" indi ando que existem mais opções abaixo ou a ima).Outra alteração bem visível são as próprias opções! Vo ê pode olo ar um"atalho" e depois o texto da opção (E foi assim que zemos, o atalho é o númeroe o texto está entre aspas). Para pegar a saída do "OK" e do "Can el", use omesmo pro esso que utilizamos para pegar a saída do --yesno, "0" para OK e "1"para "Can el". O mais ompli ado é pegar a opção sele ionada, para fazer issopre isamos: • usar um arquivo temporário om a opção e depois ler do arquivo o que ousuário es olheu ou; • Passar a saída diretamente para uma variável. CAPÍTULO 4. APARÊNCIA É TUDO... 45Para usar o primeiro dos métodos, é bem simples... apenas oloque no nal do omando dialog um 2>/tmp/arquivotemporario, omo podemos ver abaixo:dialog --menu "Sele ione uma opção do menu" 0 0 3 \1 "Opção 1" \2 "Opção 2" \3 "Opção 3" 2>/tmp/arquivotemporarioEste método é fá il, mas é um pou o desagradável depender de um arquivo externo,é preferível utilizar a segunda opção, onde onseguimos passar a saída do dialogdiretamente para uma variável:OPCAO=`dialog --stdout --menu "\Sele ione uma opção do menu" 0 0 3 \1 "Opção 1" \2 "Opção 2" \3 "Opção 3"`Logo depois de exe utar o dialog, a saída dele estará na variável OPCAO, bemmais práti o. A opção --stdout serve para dire ionar a saída do dialog (quetradi ionalmente vai para o stderr, para a saída padrão) e om isso, tornandopossível apturá-la em variáveis.Vamos passar agora para a --radiolist, podemos dizer que esta é um "mod-elo" diferente de menu, serão apresentadas várias opções para vo ê sele ionar e, omo no --menu, apenas uma delas pode estar sele ionada:dialog --radiolist "Sele ione uma opção do menu" 0 0 3 \1 "Opção 1" ON \2 "Opção 2" OFF \3 "Opção 3" OFFLembre que apenas uma das opções pode estar ativa, repare que também já deix-amos uma opção sele ionada "por default. Esta é uma vantagem, já que  a bem laro qual opção nos re omendamos ao usuário. Para saber qual foi a es olha dousuário, temos os dois métodos já apresentados para a --menu.Na nossa ordem de omplexidade, vamos agora poder pegar várias opções emuma só tela, para isso temos a -- he klist. A -- he klist é uma parente da--radiolist, sendo ambas muito semelhantes, a grande diferença é que pode-mos sele ionar mais de uma opção, enquanto na --radiolist, não usta repetir,podemos utilizar apenas uma: CAPÍTULO 4. APARÊNCIA É TUDO... 46dialog -- he klist "O que pretende apagar?" 0 40 3 \usuarios "Todos os usuários" ON \programas "Todos os programas" ON \tudo "Tudo mesmo..." OFFA saída desta aixa é o nome das várias opções sele ionadas, ada uma delas entreaspas. Isso atrapalha um pou o para trabalhar om essas opções. Uma boa idéiaé utilizar o --separate-output isso fará om que a saída seja dada uma opçãopor linha.Por último, uma aixa sem opção, em que o usuário pode fazer o que quiser, a--inputbox. Este é o tipo de aixa que vo ê vai es olher quando for pedir para oseu usuário es rever algo. Para oletar o que o seu usuário digitou, vo ê já devesaber o que fazer.dialog --inputbox "Es reva aqui alguma bobagem" 0 0Usar o dialog é uma maneira fá il de fazer om que seus s ripts tenham uma outraaparên ia, e impressionar o usuário nal. Eles sempre  am impressionados om ores, sombras e menus... até engolem sistemas que não fun ionam... os nossos,além de fun ionar, também são simpáti os -:) CAPÍTULO 5. TRABALHANDO CONECTADO 49Agora que já sabemos os omandos que devemos usar, está na hora de enviarmoso nosso e-mail, mas ele será enviado através de um simples at... veja omo:punkfrankenstein:# at < <EOF >/dev/t p/ra hael/25> MAIL FROM: punkfrankenstein> RCPT TO: punkra hael> DATA> La la la> .> QUIT> EOFE pronto! O e-mail foi enviado -:) A parte do < <EOF vo ê já onhe e mas, provavel-mente, o /dev/t p/ra hael/25 é novidade. não é? Esse redire ionamento apenasestá enviando a saída do omando at para a máquina ra hael, na porta 25, us-ando t p. É um re urso muito simples porém pou o utilizado.Com este onhe imento, podemos fazer o nosso próprio omando mail. Aprovei-tando essa nossa boa fase de genialidade, vamos hamar o nosso mail de nossomail(original, não?)#!/bin/sh## nossomail - s ript superinteligente para enviar e-mails## Verifi a a quantidade de argumentos, se for apenas# um, pega a mensagem a ser enviada diretamente do stdin## Caso ontrário, usa o segundo argumento omo mensagem#if [ "$#" = "1" ℄; thenMSG=` at -`else MSG="$2"fiFROM="$USER$HOSTNAME"TO="$1"HOST=`e ho $1 | ut -f2 -d` at < <EOF >/dev/t p/$HOST/25MAIL FROM: $FROMRCPT TO: $TODATA CAPÍTULO 5. TRABALHANDO CONECTADO 50$MSG.QUITEOFNão existem maiores segredos no s ript, já que todos os on eitos já foram utiliza-dos anteriormente (espero que vo ês ainda lembrem dos outros apítulos). Pode-mos utilizar este nosso s ript de duas maneiras, uma delas é enviando a mensagemna própria linha de omando:punkfrankenstein:~$ ./nossomail punkra hael "Teste"A outra maneira é enviando a mensagem através de um pipe:punkfrankenstein:~$ e ho TESTE | ./nossomail punkra haelPronto! Mais um exemplo que também é um s ript útil!5.2 Tro ando arquivosAlém de mandar e-mails, um outro uso típi o para uma rede é a transferên ia dearquivos. Existe uma série de omandos interessantes para utilizarmos em nossoss ripts e manipularmos arquivos em rede.O primeiro da lista é o wget. Ele pode ser utilizado para baixar sites inteiros,tanto via http (Web) omo por ftp (ftp é ftp mesmo) e é muito útil. Podemosimaginar um uso bem simples, todo dia, a lial da sua empresa em Laodi éia doOeste disponibiliza um arquivo om o ba kup daquele dia. Ba kups ostumam sermuito grandes para se enviar por e-mail (e, só para onstar, um arquivo enviadopor e-mail aumenta de tamanho). Ah, esses ba kups devem ser gravados na sededa empresa...A melhor oisa a fazer é aproveitar o horário da madrugada, quando não os-tuma haver ninguém trabalhando e muito menos usando a banda e trazer o arquivo.Vamos usar o wget.wget http://laodi eia.xingling. om.br/ba kups/ba kup_de_hojePronto! Este é o omando. Basta digitá-lo e o ba kup será trazido até vo ê, omo que por mági a. Isso irá baixar o arquivo ba kup_de_hoje que está no di-retório ba kups dentro da máquina laodi eia.firma-xingling. om.br atravésde http. Este nosso primeiro omando tem um pequeno problema: onde ele vaiguardar o arquivo que baixar? CAPÍTULO 5. TRABALHANDO CONECTADO 51Se vo ê digitá-lo no prompt, ele vai baixar o arquivo no diretório em que estiver.Mas, ostuma-se olo ar ba kups em lugares espe í os. Muito mais agradávelseria usar:wget -O /ba kup \http://laodi eia.xingling. om.br/ba kups/ba kup_de_hojePronto! Agora  ou bom. Se o arquivo fosse disponibilizado via ftp, poderíamosusar o wget também, apenas tro ando onde está http:// por ftp://.E se fosse o aso inverso? E se nós tivéssemos que enviar um arquivo para alial de Otonópolis do Sul? Talvez um relatório... bom, se for por ftp podemosusar o ótimo n ftp. Ele agrega vários omandos utilíssimos para transferên ias dearquivos via s ripts. No nosso aso de enviar arquivos, o omando apropriado é on ftpput, uja sintaxe é:n ftpput -u usuario -p senha maquina-remota aminho arquivo-lo alSe quiséssemos enviar o arquivo Exemplo1 para o diretório aulas_shell/rede damáquina maquina_remota. Ou seja, para o ftp://maquina_remota/aulas_shell/rede/iríamos fazer assim:n ftpput -u usuario -p senha maquina_remota aulas_shell/rede Exemplo1Onde indi a o usuario e a senha, vo ê olo a o usuário e senhas apropriados.Podemos também utilizar o n ftp para baixar arquivos, através do n ftpget. Elepossui uma sintaxe mais simples que a do n ftpput.n ftpget -u usuario -p senha ftp://exemplo.servidor/dir/arquivoVale a pena dar uma boa explorada nesses omandos, onsulte a man-page delese o help. Muitos problemas insolúveis podem ser resolvidos por eles, experiên iaprópria.5.2.1 HTML...Existem momentos em que não queremos baixar o arquivo HTML em si, e sim apágina já renderizada. Dependendo do que queremos fazer, pode ser muuuito maissimples en ontrar uma determinada informação na página já formatada.Para esses asos, uma boa opção seria utilizar o lynx. Como exemplo, ireiutilizar esta página: APÊNDICE A. USANDO O EDITOR DE TEXTOS: VI 54te las para fa ilitar a edição de textos.A.2.1 Navegando pelo textoApesar das setinhas fun ionarem no elvis, elas não fun ionam no vi padrão,então é bom onhe er omo fazer os movimentos do jeito  erto. Todos estes omandos de movimentação devem ser dados no modo de omando.Os mais bási os são: • j,k,h,l -> respe tivamente: para baixo, para ima, para a esquerda e paraa direita. Vo ê pode substituir o l pela barra de espaços • enter -> Vai para o iní io da próxima linha (nããão...) • 0 -> Começo da linha (atenção, 0 é um zero e não um o maiús ulo) • $ -> Final da linha • w,b -> Caminham pelas palavras, w para frente e b para trás. • :/,? -> Pro ura por um padrão (o uso é :/padrão ou ?padrão), o :/ vaipara frente e o ? para trás. Para os preguiçosos, o n repete a última bus a.Existem outros, mas estes são su ientes para navegarmos no texto e ainda fazer-mos alguns truques -;).A.2.2 Mar ando textosVo ê pode mar ar áreas retangulares do texto om o Ctrl+V. Apenas pressioneessas te las e sele ione o texto desejado om as setas. Após sele ionar o texto,pressione y para opiar. Mova o ursor até a posição em que deseja opiar o textoe aperte p. Se, ao invés de opiar o texto sele ionado vo ê preferir apagá-lo, troqueo y pelo d.Se não gostar de demar ar retângulos, pode mar ar linhas inteiras utilizando oatalho Shift+V e depois movendo o ursor pelas linhas desejadas. Se quiser opiarapenas a linha em que está, utilize o yy.Um re urso muito útil para quem programa, é utilizar o > ou o < sobre o textosele ionado. Isso faz om que ele aumente ou diminua uma indentação, tornandoo ódigo muito mais legível. A redite, isso é uma mão na roda enquanto editamosum shell s ript. APÊNDICE A. USANDO O EDITOR DE TEXTOS: VI 55A.2.3 ApagandoBom, vo ê viu que apagar textos mar ados é apertando d. Para apagar outras oisas também é assim... E ainda é possível aproveitar outros re ursos... porexemplo, se vo ê apertar a letra d, e depois o número 5 e por m a seta para adireita, irá apagar 5 ara teres para a direita. Se zer isso e apertar a seta para aesquerda, irá apagar 5 ara teres para a esquerda e, se apertar a seta para ima,ou para baixo, irá apagar 5 linhas nessas direções.Normalmente, o que se mais utiliza é o d(seta para o lado) para apagar apenasum ara ter. Outro muito utilizado é o D que apaga a partir da posição do ursoraté o nal da linha e o dd que apaga a linha inteira.Um texto apagado, pode ser olado utilizando o omando p.Se vo ê estiver usando o d para apagar o nal de uma linha para olar umalinha na outra, está usando o omando errado... para fazer isso, use o J de Join(ou seja, juntar). Leia e lembre disso, irá lhe poupar dores de abeça futuras...A.3 Saindo do VI e outros adi ionais...Como sempre, sobram alguns omandos que a gente não sabe onde deve olo ar...eu resolvi que devo olo ar aqui -;)A.3.1 Sair do VIPara sair do VI, salvando o arquivo que vo ê es reveu, use :wq, se não quisersalvar, use :q! é, om a ! no nal mesmo. Saber sair do VI é muito importante,normalmente é a primeira oisa que a onte e om os marinheiros de primeiraviagem:  am presos. Agora vo ê não irá air nessa. (OK, mas pode air emoutras armadilhas...)A.3.2 Lendo um arquivo no VIEsta é outra boa... enquanto vo ê estiver editando um arquivo, pode pre isar do onteúdo de algum outro... para isso, use o :r nome_do_outro_arquivo, o talnome_do_outro_arquivo será arregado logo abaixo do ursor.Vo ê também pode fazer um truque! O :! é utilizado para exe utar um omando, om :r!date por exemplo, vo ê irá inserir o resultado do omandodate no seu arquivo! (Di a boa!!!) APÊNDICE A. USANDO O EDITOR DE TEXTOS: VI 56A.3.3 SubstituiçõesExistem várias outras maneiras, mas es olhi uma opção espe ial para nós quesomos quase experts no sed (anal, vimos alguns parágrafos sobre ele no Capítulo3). Ela tem mais ou menos a mesma sintaxe do sed.:s/padrão1/padrão2/Isso irá substituir onde está padrão1 pelo padrão2. Mas apenas na primeirao orrên ia na linha em que estiver o ursor... usando: :s/padrão1/padrão2/g,vo ê substitui o texto na linha inteira e, usando um % antes do s, vo ê realizasubstituições no texto inteiro!!!Como foi possível ver utilizando o %, é possível limitar a ação do omando desubstituição (bom, no aso espe í o do %, nós limitamos a substituição ao textointeiro). Mas podemos fazer diferente::1,3s/padrão1/padrão2/gIsso irá substituir padrão1 por padrão2 nas linhas de 1 a 3. E, atenção para adi a: . é a linha atual, e $ é o nal do arquivo. Dá para fazer alguns intervalosinteressantes utilizando esses dois. Ah! E se vo ê quiser repetir a sua últimasubstituição, use :&. E, para desfazer a sua última ação, use o omando u.A.4 Congurações...Algumas ongurações interessantes. Quando são utilizadas om freqüên ia, são olo adas em um arquivo do tipo .vimr , .exr , et ... Para olo á-las enquantoestá editando um arquivo, vo ê deve primeiro passar para o modo de omando efazer::set autoindentIsso irá ativar a indentação automáti a (útil para quem está programando). Paradesativar a indentação, use::set noautoindentSe quiser olo á-los em um arquivo, basta ir olo ando os omandos um abaixodo outro, sem os dois pontos ini iais. Alguns arquivos .vimr a abam  andoquilométri os... para quem usa o vim, dentro da do umentação do programa os-tuma  ar o vimr _example.vim que é um ótimo e bem ompleto exemplo...Algumas das opções que podemos usar são APÊNDICE B. COMANDOS ÚTEIS... 59 • -R -> lista re ursivamente o diretório desejado e seus subdiretórios • -h -> olo a os tamanhos de arquivos em formato humano, 4k ao invés de4096, 1M ao invés de 1048576 e assim por diante.Estas opções podem ser ombinadas de diferentes formas. Ex: ls -laRhB.1.2 rm - Remover arquivosRemove um arquivo (ou lista de arquivos). É bom lembrar que nem sempre(tradução: quase nun a) é possível re uperar um arquivo apagado, por isso, façaba kups e tome uidado. Opções úteis: • -i -> Pergunta antes de remover o arquivo. • -r -> Re ursivo, apagando o interior dos diretórios e os próprios. • -f -> Força a remoção do arquivo (CUIDADO)E, para não  armos órfãos, um exemplo de uso:rm -rf arquivo1 arquivo2 diretorio3B.1.3 mv - Movendo e Renomeando arquivosMove um arquivo de um lo al para outro na árvore de diretórios. É possível usareste omando omo um truque para renomear arquivos, movendo-os para o nomenovo: mv nome_velho nome_novoOu, na sua outra forma:mv / aminho/antigo/do/arquivo /lugar/novo/do/arquivoAs duas formas a eitam as opções -f e -i, sendo que a primeira faz om que o omando mv sobres reva o arquivo novo, aso já exista um arquivo om este nome,e a segunda pergunta antes de sobres revê-lo. APÊNDICE B. COMANDOS ÚTEIS... 60B.1.4 p - Copia arquivosO omando p, opia arquivos e diretórios. Podendo (in lusive) tro ar o nomedestes arquivos e diretórios no pro esso da ópia, ou manter o mesmo nome, desdeque os arquivos sejam opiados para uma lo alização diferente da original. O modode uso é simples: p arquivo_original opia_do_arquivoOu p arquivo_original /outro/lugar/para/o/arquivo_originalClaro que é possível opiar o arquivo para outro diretório om um nome diferente,basta espe i ar qual seria esse nome. Além disso, o omando p possui váriasopções: • -f -> Sobres reve os arquivos de destino, aso possuam os mesmos nomes • -i -> Pergunta antes de sobres rever os arquivos. • -p -> Copia preservando todos os atributos, grupos, permissões, et ... • -R -> Copia re ursivamente, opiando diretórios, subdiretórios e seus on-teúdos. • -a -> Tenta manter a maior quantidade de informação possível dos arquivos opiados.B.1.5 le - des obre o tipo do arquivoNão pre isa de maiores expli ações. Basta usar:file nome_do_arquivoE o omando retorna o tipo de arquivo om que estamos trabalhando.B.1.6 mkdir - Cria diretórioPara riar um diretório, usamos o omando mkdir, om a seguinte sintaxe:mkdir nome_do_diretorioé possível espe i ar também um aminho inteiro:mkdir / aminho/para/o/nome_do_diretorioE, se este aminho não existir, é possível riá-lo utilizando a opção -p:mkdir -p / aminho/para/o/diretorio/nome_do_diretorioPara remover o diretório riado, podemos usar o rmdir ou, o já onhe ido, rm. APÊNDICE B. COMANDOS ÚTEIS... 61B.2 ...para trabalhar om textos...B.2.1 at - O texto na telaO prin ipal uso do at é mostrar o onteúdo de um arquivo na tela. Claro, om osredire ionamentos que aprendemos, podemos mandar este onteúdo para qualquerlugar que quisermos.Uma opção interessante do at é a -n, que numera as linhas que são apre-sentadas pelo omando at, fa ilitando sele ionar apenas uma determinada linha.Existe um omando irmão do at, o ta que mostra o arquivo em modo reverso, om as últimas linhas sendo mostradas primeiro (e, obviamente, as primeiras sendomostradas por último)B.2.2 head - Mostra o iní io do arquivoO omando head imprime as primeiras 10 linhas de um arquivo. Se utilizarmos aopção -N (onde N é um número) serão impressas as primeiras N linhas do arquivo.Como no exemplo:head -5 arquivoB.2.3 tail - Mostra o nal de um arquivoPrati amente idênti o ao head, mas trabalhando om o nal do arquivo ao invésde om o omeço. Uma boa opção é a -f para quando estiver observando arquivosde log. Neste aso o tail não pára, ele ontinua mostrando as últimas linhas doarquivo e as linhas que forem sendo adi ionadas nele. O uso do tail é:tail -7 arquivoB.2.4 grep - En ontrando o que se pro uraO omando grep é utilizado prin ipalmente para se lo alizar um texto espe í- o (ou uma expressão regular) dentro de um (ou mais) arquivos. O omando éextremamente poderoso e possui uma série de opções.A sintaxe default é:grep [-opções℄ texto_ou_expressão_regular arquivoAo invés de arquivo, podemos passar a saída de outros omandos para o grep,via pipe. Uma expli ação mais detalhada do uso do omando e de expressõesregulares pode ser en ontrada no Capítulo 3. APÊNDICE B. COMANDOS ÚTEIS... 64Irá mostrar os pro essos do usuário, em forma de árvore e om todas as variáveis deambiente logo após o nome do pro esso que está sendo exe utado. Já o omando:# ps -efIrá mostrar todos os pro essos em exe ução na máquina om vários dados detal-hados. Este tipo de omportamento torna parti ularmente difí il passar uma listade opções. Algumas interessantes são: • ax -> Mostra todos os pro essos em exe ução. • x -> Todos os pro essos do usuário. • u -> Mostra o usuário responsável pelo pro esso (entre outras oisas). • -e -> Todos os pro essos em exe ução (o mesmo do ax). • -f -> Expõe os pro essos em formato de árvore.A manpage mostra vários outros. In lusive, o su iente para sequer onfundirrealmente bastante. Use as opções obs uras om uidado. Se vo ê gosta do ps -f,divirta-se om o pstree.B.3.2 free - informações sobre a memória do sistemaMostra a quantidade de memória livre no sistema. Este omando mostramos omdetalhes no meio do texto, mas mostramos também a maior parte dos outros queapare em neste apêndi e...punkra hael:~$ freetotal used free shared buffers a hedMem: 256148 130316 125832 0 8636 76512-/+ buffers/ a he: 45168 210980Swap: 265032 0 265032Na primeira linha, temos o total de memória, a quantidade utilizada (in luindoos buers e o a he). Na segunda linha temos algo mais próximo da realidade,mostrando a memória utilizada sem trabalhar om a he e o buer. Por m, naúltima linha, temos a utilização da memória swap.Existem algumas opções para alterar a saída do programa: • -o -> Não mostra a linha -/+ buffers/ a he: • -t -> Mostra o total de memória, somando a swap om a memória RAM. • -m -> A quantidade de memória é mostrada em Megas, ao invés de Kilobytes. APÊNDICE B. COMANDOS ÚTEIS... 65B.3.3 uname - identi ação do sistemaMostra prati amente tudo sobre a sua máquina. O nome da máquina, o sistemaopera ional, a arquitetura, ompilação do kernel, versão do kernel, et ... por ex-emplo:punkra hael:~$ uname -n -r -m -ora hael 2.4.22 i686 GNU/LinuxCom isto estamos mostrando o nome da máquina (-n), a versão do kernel (-r),o tipo de hardware (-m) e o sistema opera ional (-o). Caso queira ver todas asinformações disponíveis, é possível utilizar a opção -a.B.3.4 date - a data do sistemaO omando date apresenta a data e hora do sistema. É bem útil para fazer arquivos om o nome do dia (por exemplo, arquivos de ba kup). Es rever simplesmentedate, retorna algo do tipo:Fri Mar 26 00:16:49 BRT 2004Mas é possível ongurar a saída do omando date para oisas mais ivilizadas(ou, pelo menos, melhores para olo ar em nome de arquivo). Faça assim:punkra hael:~$ date +%Y_%m_%d2004_03_26Estes %alguma oisa, tem um signi ado espe ial, omo podemos ver abaixo: • %Y -> Ano, om quatro dígitos, se quiser om dois, use o %y • %m -> Mês, de forma numéri a • %b -> Nome do mês, abreviado. Se quiser o nome inteiro, use %B. • %H -> hora ( om dias de 24 horas orridas... e não 12 horas AM e 12 horasPM) • %M -> minutosDi a de amigo, guarde a data no formato que lhe agradar em uma variável... vo êpode pre isar disso várias vezes durante um s ript. APÊNDICE B. COMANDOS ÚTEIS... 66B.3.5 mount - Vendo os sistemas de arquivos montadosO omando mount mostra todos os dispositivos montados (ou sistemas de arquivosremotos), seus pontos de montagem, o tipo de sistema de arquivos e as opções demontagem.Vo ê também pode usar o omando mount para montar um sistema de arquivos.A sintaxe é a seguinte:mount [-t tipo_de_fs℄ [-o opções℄ dispositivo ponto_de_montagemRe omendação: ler a manpage antes de omeçar a trabalhar om as opções do omando. Várias delas só fun ionam em determinados sistemas de arquivos. Se forutilizado apenas o mount, vo ê verá as informações des ritas no primeiro parágrafodeste item. B.4 ...para outras oisasAlguns omandos que não se enquadram nos des ritos a ima, mas são muito úteismesmo assim:B.4.1 ping - Veri a se uma determinada máquina está vivaÓtimo para examinar se uma máquina está respondendo, se está a essível ou parater alguma idéia de omo está a rede. Use o omando ping assim:ping nome_da_maquinaEle omeçará a fazer innitos pings para a máquina desejada. O ping innito nãoé dos melhores para usarmos em s ripts. Geralmente utilizamos algumas opções: • - n -> Limita o número de pings. Serão realizados apenas n pings. • -w n -> Espera no máximo n segundos para re eber a resposta do pingenviado.Com estas duas é mais fá il dete tar se uma determinada máquina está viva oumorta (o -w ajuda bastante a evitar uma espera prati amente eterna).
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved