Vous êtes sur la page 1sur 5

Shell Script

Um shell script um conjunto de comandos de terminal, organizados de forma a desempenhar alguma tarefa. O bash extremamente poderoso, o que d uma grande flexibilidade na hora de escrever scripts. Voc pode inclusive incluir trechos com comandos de outras linguagens interpretadas, como perl ou python, por exemplo.

O primeiro passo para escrever um script descobrir uma forma de fazer o que precisa via linha de comando. Vamos comear um um exemplo simples:

O comando "wget" permite baixar arquivos; podemos us-lo para baixar o ISO do Kurumin, por exemplo: $ wget -c http://fisica.ufpr.br/kurumin/kurumin-6.0.iso (o "-c" permite continuar um download interrompido) Depois de baixar o arquivo, importante verificar o md5sum para ter certeza que o arquivo est correto: $ md5sum kurumin-6.0.iso Estes dois comandos podem ser usados para criar um script rudimentar, que baixa o Kurumin e verifica o md5sum. Abra o kedit ou outro editor de textos que preferir e inclua as trs linhas abaixo: #!/bin/sh wget -c http://fisica.ufpr.br/kurumin/kurumin-6.0.iso md5sum kurumin-6.0.iso O "#!/bin/sh" indica o programa que ser usado para interpretar o script, o prprio bash. Por norma, todo script deve comear com esta linha. Na verdade, os scripts funcionam sem ela, pois o bash o interpretador default de qualquer maneira, mas no custa fazer as coisas certo desde o incio. Existe a possibilidade de escrever scripts usando outros interpretadores, ou mesmo comandos, como o sed. Neste caso o script comearia com "#!/bin/sed", por exemplo. Note que a tralha, "#", usada para indicar um comentrio. Toda linha comeada com ela ignorada pelo bash na hora que o script executado, por isso a usamos para desativar linhas ou incluir comentrios no script. A linha "#!/bin/sh" a nica exceo para esta regra.

Ao terminar, salve o arquivo com um nome qualquer. Voc pode usar uma extenso como ".sh" para que outras pessoas saibam que se trata de um shell script, mas isto no necessrio. Lembre-se de que, no Linux, as extenses so apenas parte do nome do arquivo. Marque a permisso de execuo para ele nas propriedades do arquivo, ou use o comando: $ chmod +x baixar-kurumin.sh Execute-o colocando um "./" na frente do nome do arquivo, o que faz o interpretador entender que ele deve executar o "baixar-kurumin.sh" que est na pasta atual. Caso contrrio ele tenta procurar nas pastas "/bin/", "/usr/bin" e "/usr/local/bin" que so as pastas onde ficam os executveis do sistema e no acha o script. $ ./baixar-kurumin.sh O md5sum soma os bits do arquivo e devolve um nmero de 32 caracteres. No mesmo diretrio do servidor onde foi baixado o arquivo, est disponvel um arquivo de texto com o md5sum correto do arquivo. O resultado do md5sum do arquivo baixado deve ser igual ao do arquivo, caso contrrio significa que o arquivo veio corrompido e voc precisa baixar de novo. Voc j deve estar cansado de baixar as novas verses do Kurumin, e j sabe de tudo isso. Podemos aproveitar para ensinar isso ao nosso script, fazendo com que, depois de baixar o arquivo, ele verifique o md5sum e baixe o arquivo de novo caso ele esteja corrompido. Isto vai deixar o script um pouco mais complexo: #!/bin/sh versao="6.0" mirror=http://fisica.ufpr.br/kurumin/ wget -c "$mirror"/kurumin-"$versao".iso md5sum=`md5sum kurumin-"$versao".iso` wget -c "$mirror"/kurumin-"$versao".md5sum.txt md5sumOK=`cat kurumin-"$versao".md5sum.txt` if [ "$md5sum" != "$md5sumOK" ]; then echo "Arquivo corrompido, vou deletar e comear novamente." rm -f kurumin-"$versao".iso sleep 120 ./baixar-kurumin.sh

else echo "O arquivo foi baixado corretamente." fi Voc vai perceber que ao executar este segundo script, ele vai tentar baixar o arquivo novamente sempre que o md5sum no bater, se necessrio vrias vezes. Para isso, comeamos a utilizar algumas operaes lgicas simples, que lembram um pouco as aulas de pseudo-cdigo que os alunos de Cincias da Computao tm no primeiro ano. Em primeiro lugar, este segundo script usa variveis. As variveis podem armazenar qualquer tipo de informao, como um nmero, um texto ou o resultado de um comando. Veja que no incio do script estou definindo duas variveis "versao" e "mirror", que utilizo em diversas partes do script. Ao armazenar qualquer texto ou nmero dentro de uma varivel, voc passa a poder utiliz-la em qualquer situao no lugar no valor original. A vantagem de fazer isso que, quando precisar alterar o valor original, voc s vai precisar alterar uma vez. O mesmo script poderia ser adaptado para baixar uma nova verso do Kurumin, ou para baix-lo a partir de outro mirror simplesmente alterando as duas linhas iniciais. Usar variveis desta forma permite que seus scripts sejam reutilizveis, o que a longo prazo pode representar uma grande economia de tempo. No script anterior, usamos o comando "md5sum kurumin-6.0.iso". Ele simplesmente mostra o md5sum do arquivo na tela, sem fazer mais nada. No segundo script, esta linha ficou um pouco diferente: md5sum=`md5sum kurumin-$versao.iso`. A diferena que, ao invs de mostrar o mds5um na tela, armazenamos o resultado numa varivel, chamada "md5sum". O sinal usado aqui no o apstrofo, como mais comum em outras linguagens, mas sim a crase (o mesmo do ""). O shell primeiro executa os comandos dentro das crases e armazena o resultado dentro da varivel, que podemos utilizar posteriormente. Por padro, os mirrors com o Kurumin sempre contm um arquivo ".md5sum.txt" que contm o md5sum da verso correspondente. Para automatizar, o script baixa tambm este segundo arquivo e armazena o contedo numa segunda varivel, a "md5sumOK". Neste ponto, temos uma varivel contendo o md5sum do arquivo baixado, e outra contendo o md5sum correto. As duas podem ser comparadas, de forma que o script possa decidir se deve baixar o arquivo de novo ou no. Para comparar duas variveis (contendo texto) num shell script, usamos o smbolo "!=" (no igual, ou seja: diferente). Para saber se o arquivo foi baixado corretamente, comparamos as duas variveis: [ "$md5sum" != "$md5sumOK" ]. Alm do "!=", outros operadores lgicos que podem ser usados so: = : Igual. -z : A varivel est vazia (pode ser usada para verificar se determinado comando gerou algum erro, por

exemplo). -n : A varivel no est vazia, o oposto do "-z". Estas funes permitem comparar strings, ou seja, funcionam em casos onde as variveis contm pedaos de texto ou o resultado de comandos. O bash tambm capaz de trabalhar com nmeros e inclusive realizar operaes aritmticas. Quando precisar comparar duas variveis numricas, use os operadores abaixo: -lt : (less than), menor que, equivalente ao <. -gt : (greather than), maior que, equivalente ao >. -le : (less or equal), menor ou igual, equivalente ao <=. -ge : (greater or equal), maior ou igual, equivalente ao >=. -eq : (equal), igual, equivale ao =. -ne : (not equal) diferente. Equivale ao != que usamos a pouco. Mas, apenas comparar no adianta. Precisamos dizer ao script o que fazer depois. Lembre-se de que os computadores so burros, voc precisa dizer o que fazer em cada situao. Neste caso temos duas possibilidades: o md5sum pode estar errado ou certo. Se estiver errado, ele deve baixar o arquivo de novo, caso contrrio no deve fazer nada. Usamos ento um "if" (se) para criar uma operao de tomada de deciso. Verificamos o mds5um, se ele for diferente do correto, ento (then) ele vai deletar o arquivo danificado e comear o download de novo. Caso contrrio (else) ele vai simplesmente escrever uma mensagem na tela. if [ "$md5sum" != "$md5sumOK" ]; then echo "Arquivo corrompido, vou deletar e comear novamente." rm -f kurumin-"$versao".iso sleep 120 ./baixar-kurumin.sh else echo "O arquivo foi baixado corretamente." fi

Veja que dentro da funo "then" usei o comando para deletar o arquivo e depois executei de novo o "./baixar-kurumin.sh" que vai executar nosso script de novo, dentro dele mesmo.

Isso vai fazer com que o script fique em loop, obsessivamente, at conseguir baixar o arquivo corretamente. Uma coisa interessante nos scripts que eles podem ser executados dentro deles mesmos e alterados durante a execuo. O script pode at mesmo deletar a si prprio depois de rodar uma vez, uma espcie de script suicida :-P. preciso tomar cuidado em situaes como esta, pois cada vez que o script executa novamente a si mesmo para tentar baixar o arquivo, aberta uma nova seo do shell, o que consome um pouco de memria. Um script que entrasse em loop poderia consumir uma quantidade muito grande de memria, deixando o sistema lento. Para evitar isso, inclu um "sleep 120", que faz o script dar uma pausa de 120 segundos entre cada tentativa. Os scripts so muito teis para automatizar tarefas, que demorariam muito para serem realizas automaticamente. Imagine que voc tem uma coleo de arquivos MP3, todos encodados com 256k de bitrate. O problema que voc comprou um MP3Player xing-ling, que s capaz de reproduzir (com qualidade) arquivos com bitrate de no mximo 160k. Voc decide ento reencodar todas as msicas para 128k, para ouvi-las no MP3player. Existem vrios programas grficos que permitem fazer a converso, entre eles o Grip. Mas, esse o tipo de coisa que mais rpido de fazer via linha de comando, usando o lame, como em: $ lame -b 128 musica.mp3 128k-musica.mp3 Aqui gerado o arquivo "128k-musica.mp3" (na mesma pasta), encodado com 128k de bitrate, sem modificar o arquivo original. Para fazer o mesmo com todos os arquivos no diretrio, voc poderia usar o comando "for", que permite realizar a mesma operao em vrios arquivos de uma vez. Ele muito usado para renomear ou converter arquivos em massa, baseado em determinados critrios. No nosso caso ele poderia ser usado da seguinte forma: for arquivo in *.{mp3,MP3} do lame -b 128 "$arquivo" "128k-$arquivo" done Aqui, a regra se aplica a todos os arquivos dentro do diretrio atual que tiverem extenso ".mp3" ou ".MP3". Para cada um dos arquivos executado o comando 'lame -b 128 "$arquivo" "128k-$arquivo"', onde o "$arquivo" substitudo por cada um dos arquivos dentro do diretrio. Estes dois exemplos so scripts simples, que simplesmente executam alguns comandos, sem oferecer nenhum tipo de interatividade. Se voc quisesse que o primeiro script baixasse outro arquivo, teria que edit-lo manualmente.

Vous aimerez peut-être aussi