apostila introducao-shell

of 22 /22
Introdução ao Shell Script Aurélio Marinho Jargas http://aurelio.net

Author: marcio-pereira

Post on 29-Jun-2015

813 views

Category:

Education


0 download

Embed Size (px)

TRANSCRIPT

  • 1. Introduo ao Shell Script Aurlio Marinho Jargashttp://aurelio.net

2. Introduo ao Shell Script - Aurlio Marinho Jargas ndiceSobre o curso.......................................................................................................................1Apresentao ........................................................................................................................2 O que o shell............................................................................................................2 Shell script...................................................................................................................3 Antes de comear........................................................................................................3O primeiro shell script.........................................................................................................4Passos para criar um shell script ................................................................................4 .Problemas na execuo do script...............................................................................5 .O primeiro shell script (melhorado)...................................................................................6 .Melhorar a sada na tela..............................................................................................6Interagir com o usurio................................................................................................6Melhorar o cdigo do script.........................................................................................7Rebobinando a fita...............................................................................................................8 Variveis......................................................................................................................8 Detalhes sobre os comandos......................................................................................8 O comando test.........................................................................................................10 Tarefa: script que testa arquivos...............................................................................11Conceitos mais avanados...............................................................................................12 Recebimento de opes e parmetros ......................................................................12 Expresses aritmticas ..............................................................................................12 If, for e while..............................................................................................................13Exerccios...........................................................................................................................15Mais informaes...............................................................................................................18Respostas dos exerccios.................................................................................................19 testa-arquivos............................................................................................................19 relacao.sh..................................................................................................................19 zerador.sh..................................................................................................................19 substring.sh...............................................................................................................20 juntatudo.sh...............................................................................................................20 users.sh.....................................................................................................................20 shells.sh.....................................................................................................................20 parametros.sh ............................................................................................................20i 3. Sobre o cursoNome Introduo a Shell ScriptsInstrutor Aurlio Marinho Jargas (http://aurelio.net)Objetivo Ensinar aos alunos todos os conceitos necessrios para poderem fazer sozinhos scripts simples em shell.Pr-Requisitos Noes bsicas de informtica e operao do sistema pela linha de comando. desejado, porm no obrigatrio, noes bsicas de programao.Pblico Alvo Desenvolvedores, administradores de sistemas, programadores e interessados em geral.Durao 8 horas1 4. ApresentaoO que o shellO shell o "prompt" da linha de comando do Unix e Linux, o servo que recebe oscomandos digitados pelo usurio e os executa.O shell aquele que aparece logo aps digitar-se a senha do usurio e entrar na telapreta. Ou na interface grfica, ao clicar no cone do Xterm, rxvt, Terminal ou Console.localhost login: rootPassword:Last login: Fri Apr 16 01:57:28 on tty5[[email protected] root]# _Ali est o shell, esperando ansiosamente por algum comando para ele poder executar.Essa a sua funo: esperar e executar. Cada comando digitado lido, verificado,interpretado e enviado ao sistema operacional para ser de fato executado. No Mac OS X, o shell est em Aplicativos > Utilitrios > Terminal. No Windows preciso instal-lo com o Cygwin.Funcionando como uma ponte, o shell a ligao entre o usurio e o kernel. O kernel quem acessa os equipamentos (hardware) da mquina, como disco rgido, placa de vdeoe modem. Por exemplo, para o usurio ler um arquivo qualquer, toda esta hierarquia seguida:USURIO --> SHELL --> KERNEL --> DISCO RGIDOPara os usurios do Windows, fcil pensar no shell como um MSDOS melhorado. Aoinvs do C:> aparece um [[email protected] root]#, mas o funcionamento similar. Bastadigitar um comando, suas opes e apertar a ENTER que ele ser executado. O comandodeve estar no PATH, mensagens de aviso so mandadas para a tela e Ctrl+C interrompe ofuncionamento. Isso tudo igual em ambos.Mas o shell muito mais poderoso que seu primo distante. Alm dos comandos bsicospara navegar entre diretrios e manipular arquivos, ele tambm possui todas as estruturasde uma linguagem de programao, como IF, FOR, WHILE, variveis e funes. Com isso,tambm possvel usar o shell para fazer scripts e automatizar tarefas.Este ser o nosso foco: scripts em shell. 2 5. Introduo ao Shell Script - Aurlio Marinho JargasShell scriptUm script um arquivo que guarda vrios comandos e pode ser executado sempre quepreciso. Os comandos de um script so exatamente os mesmos que se digita no prompt, tudo shell.Por exemplo, se de tempos em tempos voc quer saber informaes do sistema comohorrio, ocupao do disco e os usurios que esto logados, preciso digitar trscomandos:[[email protected] root]# date[[email protected] root]# df[[email protected] root]# w melhor fazer um script chamado "sistema" e colocar estes comandos nele. O contedodo arquivo "sistema" seria o seguinte:#!/bin/bashdatedfwE para chamar este script, basta agora executar apenas um comando:[[email protected] root]# sistemaIsso um shell script. Um arquivo de texto que contm comandos do sistema e pode serexecutado pelo usurio.Antes de comearSe voc est acessando o sistema como usurio administrador (root), saia e entre comoum usurio normal. muito perigoso estudar shell usando o superusurio, voc podedanificar o sistema com um comando errado.Se voc no tem certeza qual o seu usurio, use o comando "whoami" parasaberComo o prompt de usurio normal diferente para cada um, nos exemplos seguintes serusado "prompt$" para indicar o prompt da linha de comando. 3 6. O primeiro shell scriptO primeiro shell script a fazer ser o "sistema" do exemplo anterior, de simplesmente juntartrs comandos em um mesmo script.Passos para criar um shell script1. Escolher um nome para o scriptJ temos um nome: sistema. Use apenas letras minsculas e evite acentos, smbolos e espao em branco2. Escolher o diretrio onde colocar o scriptPara que o script possa ser executado de qualquer parte do sistema, mova-o para umdiretrio que esteja no seu PATH. Para ver quais so estes diretrios, use o comando:echo $PATH Se no tiver permisso de mover para um diretrio do PATH, deixe-o dentro de seu diretrio pessoal ($HOME).3. Criar o arquivo e colocar nele os comandosUse o nano, VI ou outro editor de textos de sua preferncia para colocar todos oscomandos dentro do arquivo.4. Colocar a chamada do shell na primeira linhaA primeira linha do script deve ser:#!/bin/bashPara que ao ser executado, o sistema saiba que o shell quem ir interpretar estescomandos.5. Tornar o script um arquivo executvelUse o seguinte comando para que seu script seja reconhecido pelo sistema como umcomando executvel:chmod +x sistema 4 7. Introduo ao Shell Script - Aurlio Marinho JargasProblemas na execuo do script"Comando no encontrado"O shell no encontrou o seu script.Verifique se o comando que voc est chamando tem exatamente o mesmo nomedo seu script. Lembre-se que no Unix/Linux as letras maisculas e minsculas sodiferentes, ento o comando "SISTEMA" diferente do comando "sistema".Caso o nome esteja correto, verifique se ele est no PATH do sistema. O comando"echo $PATH" mostra quais so os diretrios conhecidos, mova seu script paradentro de um deles, ou chame-o passando o caminho completo.Se o script estiver no diretrio corrente, chame-o com um "./" na frente, assim:prompt$ ./sistemaCaso contrrio, especifique o caminho completo desde o diretrio raiz:prompt$ /tmp/scripts/sistema"Permisso Negada"O shell encontrou seu script, mas ele no executvel.Use o comando "chmod +x seu-script" para torn-lo um arquivo executvel."Erro de Sintaxe"O shell encontrou e executou seu script, porm ele tem erros.Um script s executado quando sua sintaxe est 100% correta. Verifique os seuscomandos, geralmente o erro algum IF ou aspas que foram abertos e no foramfechados. A prpria mensagem informa o nmero da linha onde o erro foiencontrado. 5 8. O primeiro shell script (melhorado)Nesse ponto, voc j sabe o bsico necessrio para fazer um script em shell do zero eexecut-lo. Mas apenas colocar os comandos em um arquivo no torna este script til.Vamos fazer algumas melhorias nele para que fique mais compreensvel.Melhorar a sada na telaExecutar os trs comandos seguidos resulta em um bolo de texto na tela, misturando asinformaes e dificultando o entendimento. preciso trabalhar um pouco a sada do script,tornando-a mais legvel.O comando "echo" serve para mostrar mensagens na tela. Que tal anunciar cada comandoantes de execut-lo?#!/bin/bashecho "Data e Horrio:"dateechoecho "Uso do disco:"dfechoecho "Usurios conectados:"wPara usar o echo, basta colocar o texto entre "aspas". Se nenhum texto for colocado, umalinha em branco mostrada.Interagir com o usurioPara o script ficar mais completo, vamos colocar uma interao mnima com o usurio,pedindo uma confirmao antes de executar os comandos.#!/bin/bashecho "Vou buscar os dados do sistema. Posso continuar? [sn] "read RESPOSTAtest "$RESPOSTA" = "n" && exitecho "Data e Horrio:"dateechoecho "Uso do disco:"dfechoecho "Usurios conectados:"wO comando "read" leu o que o usurio digitou e guardou na varivel RESPOSTA. Logo emseguida, o comando "test" verificou se o contedo dessa varivel era "n". Se afirmativo, o6 9. Introduo ao Shell Script - Aurlio Marinho Jargascomando "exit" foi chamado e o script foi finalizado. Nessa linha h vrios detalhesimportantes: O contedo da varivel acessado colocando-se um cifro "$" na frente O comando test til para fazer vrios tipos de verificaes em textos e arquivos O operador lgico "&&", s executa o segundo comando caso o primeiro tenha sido OK. O operador inverso o "||"Melhorar o cdigo do scriptCom o tempo, o script vai crescer, mais comandos vo ser adicionados e quanto maior,mais difcil encontrar o ponto certo onde fazer a alterao ou corrigir algum erro.Para poupar horas de estresse, e facilitar as manutenes futuras, preciso deixar ocdigo visualmente mais agradvel e espaado, e colocar comentrios esclarecedores.#!/bin/bash# sistema - script que mostra informaes sobre o sistema# Autor: Fulano da Silva# Pede uma confirmao do usurio antes de executarecho "Vou buscar os dados do sistema. Posso continuar? [sn] "read RESPOSTA# Se ele digitou n, vamos interromper o scripttest "$RESPOSTA" = "n" && exit# O date mostra a data e a hora correntesecho "Data e Horrio:"dateecho# O df mostra as parties e quanto cada uma ocupa no discoecho "Uso do disco:"dfecho# O w mostra os usurios que esto conectados nesta mquinaecho "Usurios conectados:"wBasta iniciar a linha com um "#" e escrever o texto do comentrio em seguida. Estas linhasso ignoradas pelo shell durante a execuo. O cabealho com informaes sobre o scripte seu autor tambm importante para ter-se uma viso geral do que o script faz, semprecisar decifrar seu cdigo. Tambm possvel colocar comentrios no meio da linha # como este7 10. Rebobinando a fitaAgora hora de fixar alguns dos conceitos vistos no script anterior.VariveisAs variveis so a base de qualquer script. dentro delas que os dados obtidos durante aexecuo do script sero armazenados. Para definir uma varivel, basta usar o sinal deigual "=" e para ver seu valor, usa-se o "echo":prompt$ VARIAVEL="um dois tres"prompt$ echo $VARIAVELum dois tresprompt$ echo $VARIAVEL $VARIAVELum dois tres um dois tresprompt$ No podem haver espaos ao redor do igual "="Ainda possvel armazenar a sada de um comando dentro de uma varivel. Ao invs deaspas, o comando deve ser colocado entre "$(...)", veja:prompt$ HOJE=$(date)prompt$ echo "Hoje : $HOJE"Hoje : Sb Abr 24 18:40:00 BRT 2004prompt$ unset HOJEprompt$ echo $HOJEprompt$E finalmente, o comando "unset" apaga uma varivel. Para ver quais as variveis que o shell j define por padro, use o comando "env"Detalhes sobre os comandosDiferente de outras linguagens de programao, o shell no usa os parnteses paraseparar o comando de seus argumentos, mas sim o espao em branco. O formato de umcomando sempre:COMANDOOPES PARMETROSO comando "cat" mostra o contedo de um arquivo. O comando "cat -n sistema" mostra onosso script, com as linhas numeradas. O "-n" a opo para o comando, que o instrui anumerar linhas, e "sistema" o ltimo argumento, o nome do arquivo.8 11. Introduo ao Shell Script - Aurlio Marinho JargasO "read" um comando do prprio shell, j o "date"" um executvel do sistema. Dentrode um script, no faz diferena usar um ou outro, pois o shell sabe como executar ambos.Assim, toda a gama de comandos disponveis no Unix/Linux pode ser usada em scripts!H vrios comandos que foram feitos para serem usados com o shell, so comoferramentas. Alguns deles:Comando Funo Opes teis catMostra arquivo-n, -s cutExtrai campo-d -f, -c date Mostra data -d, +... find Encontra arquivos -name, -iname, -type f, -execgrepEncontra texto-i, -v, -r, -qs, -w -xheadMostra Incio -n, -cprintfMostra textonenhuma revInverte texto nenhuma sedEdita texto -n, s/isso/aquilo/, d seqConta Nmeros -s, -f sort Ordena texto-n, -f, -r, -k -t, -o tail Mostra Final-n, -c, -ftrTransforma texto-d, -s, A-Z a-zuniqRemove duplicatas -i, -d, -u wc Conta Letras-c, -w, -l, -LUse "man comando" ou "comando --help" para obter mais informaes sobrecada um deles.E o melhor, em shell possvel combinar comandos, aplicando-os em seqncia, paraformar um comando completo. Usando o pipe "|" possvel canalizar a sada de umcomando diretamente para a entrada de outro, fazendo uma cadeia de comandos.Exemplo:prompt$ cat /etc/passwd | grep root | cut -c1-10root:x:0:0operator:xprompt$9 12. Introduo ao Shell Script - Aurlio Marinho JargasO cat mostra o arquivo todo, o grep pega essa sada e extrai apenas as linhas que contma palavra "root" e o cut por sua vez, somente nessas linhas que o grep achou, extrai os 10primeiros caracteres. Isso funciona como uma estao de tratamento de gua, onde elaentra suja, vai passando por vrios filtros que vo tirando as impurezas e sai limpa no final.E por fim, tambm possvel redirecionar a sada de um comando para um arquivo aoinvs da tela, usando o operador ">". Para guardar a sada do comando anterior no arquivo"saida", basta fazer:prompt$ cat /etc/passwd | grep root | cut -c1-10 > saidaprompt$ cat saidaroot:x:0:0operator:xprompt$ Cuidado! Shell to legal que vicia!O comando testO canivete suo dos comandos do shell o "test", que consegue fazer vrios tipos detestes em nmeros, textos e arquivos. Ele possui vrias opes para indicar que tipo deteste ser feito, algumas delas: Testes em variveisTestes em arquivos-lt Nm. menor que (LessThan)-d um diretrio-gt Nm. maior que (GreaterThan) -f um arquivo normal-le Nm. menor igual (LessEqual) -r O arquivo tem permisso de leitura -ge Nm. maior igual (GreaterEqual) -s O tamanho do arquivo maior que zero -eq Nm. igual (EQual)-w O arquivo tem permisso de escrita -ne Nm. diferente (NotEqual) -nt O arquivo mais recente (NewerThan)= String igual -ot O arquivo mais antigo (OlderThan)!= String diferente-ef O arquivo o mesmo (EqualFile)-n String no nula -a E lgico (AND)-z String nula -o OU lgico (OR) 10 13. Introduo ao Shell Script - Aurlio Marinho JargasTarefa: script que testa arquivosTente fazer o script "testa-arquivos", que pede ao usurio para digitar um arquivo e testase este arquivo existe. Se sim, diz se um arquivo ou um diretrio. Exemplo de uso:prompt$ testa-arquivosDigite o arquivo: /naoexisteO arquivo /naoexiste no foi encontradoprompt$ testa-arquivosDigite o arquivo: /tmp/tmp um diretrioprompt$ testa-arquivosDigite o arquivo: /etc/passwd/etc/passwd um arquivoprompt$11 14. Conceitos mais avanadosAt agora vimos o bsico, o necessrio para se fazer um script de funcionalidade mnima.A seguir, conceitos novos que ampliaro as fronteiras de seus scripts!Recebimento de opes e parmetrosAssim como os comandos do sistema que possuem e opes e parmetros, os scriptstambm podem ser preparados para receber dados via linha de comando.Dentro do script, algumas variveis especiais so definidas automaticamente, em especial,"$1" contm o primeiro argumento recebido na linha de comando, "$2" o segundo, e assimpor diante. Veja o script "argumentos":#!/bin/sh# argumentos - mostra o valor das variveis especiaisecho "O nome deste script : $0"echo "Recebidos $# argumentos: $*"echo "O primeiro argumento recebido foi: $1"echo "O segundo argumento recebido foi: $2"Ele serve para demonstrar o contedo de algumas variveis especiais, acompanhe:prompt$ ./argumentos um dois trsO nome deste script : ./argumentosRecebidos 3 argumentos: um dois trsO primeiro argumento recebido foi: umO segundo argumento recebido foi: doisO acesso direto, basta referenciar a varivel que o valor j estar definido. Assim possvel criar scripts que tenham opes como --help, --version e outras.Expresses aritmticasO shell tambm sabe fazer contas. A construo usada para indicar uma expressoaritmtica "$((...))", com dois parnteses.prompt$ echo $((2*3))6prompt$ echo $((2*3-2/2+3))8prompt$ NUM=44prompt$ echo $((NUM*2))88prompt$ NUM=$((NUM+1))prompt$ echo $NUM45 12 15. Introduo ao Shell Script - Aurlio Marinho JargasIf, for e whileAssim como qualquer outra linguagem de programao, o shell tambm tem estruturaspara se fazer condicionais e loop. As mais usadas so if, for e while.if COMANDOfor VAR in LISTA while COMANDOthendo do comandoscomandos comandoselsedone done comandosfiDiferente de outras linguagens, o if testa um comando e no uma condio. Porm como jconhecemos qual o comando do shell que testa condies, s us-lo em conjunto com oif. Por exemplo, para saber se uma varivel maior ou menor do que 10 e mostrar umamensagem na tela informando:if test "$VARIAVEL" -gt 10thenecho " maior que 10"elseecho " menor que 10"fiH um atalho para o test , que o comando [. Ambos so exatamente o mesmo comando,porm usar o [ deixa o if mais parecido com o formato tradicional de outras linguagens:if [ "$VARIAVEL" -gt 10 ]thenecho " maior que 10"elseecho " menor que 10"fiSe usar o [, tambm preciso fech-lo com o ], e sempre devem ter espaos aoredor. recomendado evitar esta sintaxe para diminuir suas chances de erro.J o while um lao que executado enquanto um comando retorna OK. Novamente otest bom de ser usado. Por exemplo, para segurar o processamento do script enquantoum arquivo de lock no removido:while test -f /tmp/lockdoecho "Script travado..."sleep 1done 13 16. Introduo ao Shell Script - Aurlio Marinho JargasE por fim, o for percorre uma lista de palavras, pegando uma por vez:for numero in um dois trs quatro cincodoecho "Contando: $numero"doneUma ferramenta muito til para usar com o for o seq, que gera uma seqncia numrica.Para fazer o loop andar 10 passos, pode-se fazer:for passo in $(seq 10)O mesmo pode ser feito com o while, usando um contador:i=0while test $i -le 10doi=$((i+1))echo "Contando: $i"doneE temos ainda o loop infinito, com condicional de sada usando o "break:while :doif test -f /tmp/lockthenecho "Aguardando liberao do lock..."sleep 1elsebreakfidone14 17. ExercciosA melhor parte finalmente chegou, agora a sua vez de se divertir. Seguem algunsexerccios que podem ser resolvidos usando o que foi aprendido at aqui.Alguns exigiro pesquisa e necessitaro de algumas ferramentas que foram apenascitadas, mas no aprendidas. O shelleiro tambm tem que aprender a se virar sozinho!Exerccio 1 - relacao.shRecebe dois nmeros como parmetro e mostra a relao entre eles. Exemplo:prompt$ ./relacao.sh 3 53 menor que 5prompt$ ./relacao.sh 5 35 maior que 3prompt$ ./relacao.sh 5 55 igual a 5prompt$Exerccio 2 - zerador.shRecebe um nmero como parmetro e o diminui at chegar a zero, mostrando natela cada passo, em uma mesma linha. Exemplo:prompt$ ./zerador.sh 55 4 3 2 1 0prompt$ ./zerador.sh 1010 9 8 7 6 5 4 3 2 1 0prompt$Exerccio 3 - substring.shRecebe duas palavras como parmetro e verifica se a primeira palavra est contidadentro da segunda. S mostra mensagem informativa em caso de sucesso, docontrrio no mostra nada. Exemplo:prompt$ ./substring.sh ana bananaana est contida em bananaprompt$ ./substring.sh banana mariaprompt$ ./substring.sh bananaprompt$ ./substring.shprompt$Pesquise sobre o comando grep 15 18. Introduo ao Shell Script - Aurlio Marinho JargasExerccio 4 - juntatudo.shMostra na tela "grudados" todos os parmetros recebidos na linha de comando,como uma nica palavra. Exemplo:prompt$ ./juntatudo.sh a b c d e f verde azulabcdefverdeazulprompt$Pesquise sobre o comando trExerccio 5 - users.shDo arquivo /etc/passwd, mostra o usurio e o nome completo de cada usurio dosistema (campos 1 e 5) separados por um TAB. Exemplo:prompt$ ./users.shftp FTP UsernobodyNobodynamed Domain name serverxfs X Font Servermysql MySQL serveraurelio Aurelio Marinho Jargasprompt$Pesquise sobre o comando cutExerccio 6 - shells.shDo arquivo /etc/passwd, mostra todos os shells (ltimo campo) que os usuriosusam. No mostrar linhas repetidas. Exemplo:prompt$ ./shells.sh/bin/bash/bin/false/bin/sync/sbin/halt/sbin/shutdownprompt$Pesquise sobre o comando uniq 16 19. Introduo ao Shell Script - Aurlio Marinho JargasExerccio 7 - parametros.shMostra na tela todos os parmetros recebidos na linha de comando, contando-os.Exemplo:prompt$ ./parametros.sh a b c d e fParmetro 1: aParmetro 2: bParmetro 3: cParmetro 4: dParmetro 5: eParmetro 6: fprompt$Pesquise sobre o comando shift17 20. Mais informaesLivro Programao Shell Linux Autoria de Julio Cezar Neves, Editora Brasport, ISBN 85-7452-118-3Livro BASH - Guia de Consulta Rpida Autoria de Joel Saade, Editora Novatec, ISBN 85-7522-006-3Lista de discusso nacional sobre Shell Script http://br.groups.yahoo.com/group/shell-scriptPgina do instrutor sobre Shell Script, com links para vrios outros materiaishttp://aurelio.net/shell 18 21. Respostas dos exercciosResista tentao de olhar as respostas antes de tentar fazer os exerccios! na prticaque se consolida os conhecimentos aprendidos, no pule este passo. Seja forte, insista,no desista!testa-arquivos#!/bin/bashecho -n "Digite o arquivo: "read ARQUIVOtest -d "$ARQUIVO" && echo "$ARQUIVO um diretrio"test -f "$ARQUIVO" && echo "$ARQUIVO um arquivo"test -f "$ARQUIVO" -o -d "$ARQUIVO" || echo "O arquivo $ARQUIVO no foi encontrado"echorelacao.sh#!/bin/bashif test $1 -eq $2thenecho "$1 igual a $2"elif test $1 -lt $2thenecho "$1 menor que $2"elseecho "$1 maior que $2"fizerador.sh#!/bin/bashi=$1while test $i -ge 0doecho -n "$i "i=$((i-1))doneecho19 22. Introduo ao Shell Script - Aurlio Marinho Jargassubstring.sh #!/bin/bash test $# -ne 2 && exit echo $2 | grep -qs $1 && echo "$1 est contida em $2"juntatudo.sh #!/bin/bash echo $* | tr -dusers.sh #!/bin/bash cat /etc/passwd | cut -d : -f 1,5 | tr : tshells.sh #!/bin/bash cat /etc/passwd | cut -d : -f 7 | sort | uniqparametros.sh #!/bin/bash i=0 while test "$1" do i=$((i+1)) echo "Parmetro $i: $1" shift done20