Sei sulla pagina 1di 17

Maring/PR

Apostila Shell Script

2012

Introduo
Hi, Se voc est comenando a ler esta apostila porque j conhece um pouco sobre o Shell, no ? ou pelo menos tem ideia do que . Por esse motivo no irei aprofundar tanto neste assunto e iremos direto ao x da questo. Porm para conseguirmos absorver todos os tpicos que sero apresentados aqui vamos explicar alguns e passar exemplos modelos. Good Luck.

Autor: Carlos Demetrio.

Comeando... ...nunca li nenhuma apostila que comea com um cdigo na primeira pgina. Porm vou colocar na minha. No se assuste, fiz isso para voc perceber se ler ela ser realmente til! Consegue entender esse cdigo a seguir fcilmente? #!/bin/bash #Introduo ao Shell-Script #Autor: Carlos Demetrio #Data : 19/03/2012 ###################################################### DATA=`date +%d/%m/%Y` ###################################################### menu() { reset echo "Ol, $USER." echo "Hoje : $DATA" echo -n "Digite o seu sistema operacional favorito. Ex.: linux: " read SO if [ $SO = "linux" ] then clear echo "Voc o cara!!" exit 0 elif [ $SO = "windows" ] then clear echo "Voc fraco!!" exit 0 elif [ -z $SO ] then clear echo "Digite algo..." sleep 2 menu else clear echo "Use linux que voc ser melhor!" exit 0 fi } menu;

eai... Conseguiu? Se achou muito fcil... esquece esta apostila no foi feita para voc! Caso entendeu pouca coisa ou no entendeu nada v em frente ento, pois no final da 10 pgina j ser capaz de fazer um cdigo melhor que esse. :) Dica: No fique copiando e colando os cdigos encontrados para ver o que ele faz. Tente ler ele antes e escrever ele novamente para entender na prtica. Isso ajuda muito!! Usaremos como padro aqui o shell bash Se imprimir essa apostila use esse espao em branco para colocar sua criatividade em ao, fazendo anotaes ou simplesmente riscar o papel. Lembre-se: Um desenho vale mais que mil palavras. Apesar de no usar nenhuma figura aqui. :( Meu e-mail chds_@hotmail.com, anote ele para me enviar e-mail com dvidas ou sugestes. Responderei o mais breve possvel prometo. Gosto muito deste relacionamento :)

O que shell? Shell, ele que interpreta a linha de comandos digitada pelo usurio no terminal e chama os programas desejados. Alm disso o shell tambm tem seus prprios comandos como IF, CASE, FOR, WHILE, ETC. Isso que iremos aprender aqui! Para ver como o shell faz parte do seu sistema Linux use o seguinte comando: file /usr/bin/* | grep shell Viu? ;) Entendendo de verdade... Quem usa Linux conhece bem o prompt de comando. O que muita gente no sabe que o bash tm uma poderosa linguagem de script embutido nela mesma. Diversas pessoas utilizam-se desta linguagem para facilitar a realizao de inmeras tarefas administrativas no Linux, ou at mesmo criar seus prprios programas. Patrick Volkerding, criador da distribuio Slackware, utiliza esta linguagem para toda a instalao e configurao de sua distribuio. Voc poder criar scripts para automatizar as suas tarefas dirias de um servidor, para efetuar backup automtico regularmente, procurar palavras em textos, criar formataes, e muito mais. Interpretadores de comandos so programas feitos para intermediar o usurio e seu sistema. Atravs destes interpretadores, o usurio manda um comando, e o interpretador o executa no sistema. Eles so o Shell do sistema Linux. Uma das vantagens destes shell scripts que eles no precisam ser compilados, ou seja, basta apenas criar um arquivo texto qualquer, e inserir comandos ele. Para dar este arquivo a definio de shell script, teremos que incluir uma linha no comeo do arquivo (#!/bin/bash) e torn-lo executvel, utilizando o comando chmod +x. Vamos seguir com um pequeno exemplo de um shell script que mostre na tela: Yes! Vou aprender shell script: #!/bin/bash clear echo "Yes! Vou aprender shell script" Explicando o cdigo: 1 linha: indica que os comandos sero interpretados pelo shell -> bash 2 linha: com o comando clear, limpa a tela 3 linha: exibe uma mensagem atravs do comando echo Para executar um script escrito voc deve dar permisso de execuo no arquivo. Por exemplo, vamos imaginar que esse script tenha sido gravado em um arquivo chamado primeiro. Ento usamos o comando: chmod +x primeiro e depois para executar o arquivo (o script): ./primeiro Fcil n? Agora que j entendeu, vamos para a melhor parte. ;)

Vriaveis
Entendendo varivel: Varivel um conjunto de caracteres que armazenam dados. O bash reconhece uma varivel quando ela comea com $, ou seja, a diferena entre VARIAVEL e $VARIAVEL que a primeira uma palavra qualquer, e a outra uma varivel. Para definir uma varivel, utilizamos a seguinte sintaxe: VARIAVEL="valor" O valor ser atribudo a VARIAVEL. Para mostrar o valor pode usar: echo $VARIAVEL Valor pode ser uma frase, nmeros, outras variveis ou comandos. O valor pode ser expressado entre as aspas (), apstrofos () ou crases (). As aspas vo interpretar as variveis que estiverem dentro do contexto, os apstrofos retornar varivel o valor literalmente sem interpretar nada e as crases iro interpretar um comando e retornar a sua sada para a varivel. Vejamos exemplos: $ VARIAVEL="Eu estou logado no bash como usurio: $USER" $ echo $VARIAVEL Eu estou logado no bash como usurio: demetrio $ VARIAVEL='Eu estou logado no bash como usurio $USER' $ echo $VARIAVEL Eu estou logado no bash como usurio $USER $ VARIAVEL="Meu diretrio atual o `pwd`" $ echo $VARIAVEL Meu diretrio atual o /home/demetrio Entendeu? Caso no, leia novamente pois as vriaveis so fundamentais! Se voc quiser criar um script em que o usurio deve interagir com ele, possvel que voc deseje que o prprio usurio defina o valor a uma varivel, e para isso usamos o comando read, que dar uma pausa no script e ficarar esperando o usurio digitar algum valor e tecle ENTER. Exemplo: #!/bin/bash clear echo "Entre com o valor para a varivel: " read VARIAVEL echo "O valor digital : '$VARIAVEL' O valor digital 'valor digitado'

Explicando o cdigo: 1 linha: indica que os comandos sero interpretados pelo shell -> bash **Ateno apartir de agora essa linha no ser mais comentada** 2 linha: limpa a tela do terminal com o comando clear 3 linha: comando echo exibe a mensagem no terminal solicitando o digitar... 4 linha: o comando read espera o usurio que executou o script digitar alguma coisa e apertar a tecla ENTER 5 linha: exibe na tela do terminal o que foi digitado/ armazenado na VARIAVEL Dica: Caso no entendeu faa o teste real. Lembrando, tente no copiar(CTRL + C)! ;) [1] Ler o "man bash" em ingls, inteiro, algo memorvel que s se faz uma vez na vida... (Aurelio Marinho Jargas)

IF Controle de fluxo so comandos que vo testando algumas alternativas, e de acordo com essas alternativas, vo executando comandos. Um dos comandos de controle de fluxo mais usados certamente o if, que baseado na lgica se acontecer isso, irei fazer isso, seno, irei fazer aquilo. Vamos dar um exemplo: if [ -e $OLDPWD ] then echo 'A varivel $OLDPWD existe.' else echo 'A varivel $OLDPWD no existe.' fi Entendendo o cdigo rapidamente: o if verifica se a vriavel OLDPWD existe(-e), caso exista executa (then) echo 'A varivel $OLDPWD existe.', seno(else) echo 'A varivel $OLDPWD no existe.' e fecha o bloco com o fi. Lista de operadores que podem ser usados: -eq -ne -gt -lt -o -d -e -z -f -o -r -w -x Igual Diferente Maior Menor Ou Se for um diretrio Se existir Se estiver vazio Se conter texto Se o usurio for o dono Se o arquivo pode ser lido Se o arquivo pode ser alterado Se o arquivo pode ser executado

Existem inmeros comandos no Linux, e para explicar todos teramos de publicar um livro e no fazer uma simples apostila. Tambm existem outras formas de aprender os comandos, em relao a estrutura tambm usada em todas as programaes. Primeiro de tudo voc pode dar uma olhada na manpage do bash(comando man bash, lembra da frase anterior do Aurelio?), que disponibilizar os comandos embutidos no interpretador de comandos. Uma das coisas essencias para o aprendizado sair coletando exemplos de outros scripts e ir estudando-os minuciosamente. Procure sempre comandos e expresses novos em outros scripts e em manpages dos comandos. E por ltimo, mas no o menos importante, praticar bastante! :) Enfim seja criativo e crie seus prprios scripts que facilite de uma vez s sua vida no Linux.

CASE O case para controle de fluxo, tal como o if, mas enquanto o if testa expresses no exatas, o case vai agir de acordo com os resultados exatos. Vejamos um exemplo: case $X in parametro1) comando1 comando2 ;; parametro2) comando3 comando4 ;; *) echo "Voc tem de entrar com um parmetro vlido" ;; esac Aqui aconteceu o seguinte: o case leu a varivel $X (que o primeiro parmetro passado para o programa), e comparou com valores exatos. Se a varivel $X for igual parametro1, ento o programa executar o comando1 e o comando2; se for igual parametro2, executar o comando3 e o comando4, e assim em diante. A ltima opo (*), uma opo padro do case, ou seja, se o parmetro passado no for igual a nenhuma das outras opes anteriores, esse comando ser executado automaticamente. Veja o mesmo exemplo com if: if [ -z $X ] then echo "Voc tem de entrar com um parmetro vlido" elif [ $X = "parametro1" ] then comando1 comando2 elif [ $X = "parametro2" ] then comando3 comando4 else echo "Voc tem de entrar com um parmetro vlido" fi Obs.: Quando precisar testar mais de uma condio no if, usa o comando elif(else+if). Dica: As vezes melhor usar o case do que o if. ;)

FOR O lao for vai substituindo uma varivel por um valor, e vai executando os comandos pedidos. Veja um exemplo: for X in * do cp $X $X.backup mv $X.backup /mnt/backup done Primeiramente o lao for atribuiu o valor de retorno do comando *(que equivalente a um ls sem nenhum parmetro) para a varivel $X, depois executou o bloco de comandos. Em seguida ele atribui outro valor do comando * para a varivel $X e reexecutou os comandos. Isso se repete at que no sobrem valores de retorno para o *. Outro exemplo: for ORIGINAL in * do RESULTADO=`echo $ORIGINAL | tr 'A-Z] [a-z]` if [ ! -e $RESULTADO ] then mv $ORIGINAL $RESULTADO fi done Aqui, o que ocorre a transformao de letras maisculas para minsculas. Para cada arquivo que o lao l, uma varivel chamada $RESULTADO ir conter o arquivo em letras minsculas. Para transformar em letras minsculas, usei o comando tr. Caso no exista um arquivo igual e com letras minsculas, o arquivo renomeado para o valor da varivel $RESULTADO, de mesmo nome, mas com letras minsculas. Como os exemplos ilustram, o lao for pode ser bem til no tratamento de mltiplos arquivos. Voc pode deix-los todos com letras minsculas ou maisculas sem precisar renomear cada um manualmente, pode organizar dados, fazer backup, entre outras coisas. Think!

WHILE O while testa continuamente uma expresso, at que ela se torne falsa. Exemplo: VARIAVEL="valor" while [ $VARIAVEL = "valor" ] do comando1 comando2 done O que acontece aqui o seguinte: Enquanto a $VARIAVEL for igual a valor, o while ficar executando os comandos 1 e 2, at que a $VARIAVEL no seja mais igual a valor. Se no bloco dos comandos a $VARIAVEL mudasse, o while iria parar de executar os comandos quando chegasse em done, pois agora a expresso $VARIAVEL = valor no seria mais verdadeira. UNTIL O until tem as mesmas caractersticas do while, mas a nica diferena que ele faz o contrrio. Veja o exemplo abaixo: VARIAVEL="naovalor" until [ $VARIAVEL = "valor" ] do comando1 comando2 done Ao invs de executar o bloco de comandos (comando1 e comando2) at que a expresso se torne falsa, o until testa a expresso e executa o bloco de comandos at que a expresso se torne verdadeira. No exemplo, o bloco de comandos ser executado desde que a expresso $VARIAVEL = valor no seja verdadeira. Se no bloco de comandos a varivel for definida como valor, o until para de executar os comandos quando chega ao done. Vejamos um exemplo para o until que, sintaticamente invertido, serve para o while tambm: VAR=1 CONT=0 until [ $VAR = "0" ] do comando1 comando2 if [ $CONT = 9 ] then VAR=0 fi CONT=$((CONT + 1)) done

Entendendo: Primeiro, atribumos ou declaramos varivel $VAR o valor 1. A varivel $CONT ser uma contagem para quantas vezes quisermos executar o bloco de comandos. O until executa os comandos 1 e 2, enquanto a varivel $VAR for igual a 0. Ento usamos um if para atribuir o valor 0 para a varivel $VAR, se a varivel $CONT for igual a 9. Se a varivel $CONT no for igual a 0, soma-se 1 a ela. Isso cria um lao que executa o comando 10 vezes, porque cada vez que o comando do bloco de comandos executado, soma-se 1 varivel $CONT, e quando chega em 9, a varivel $VAR igualada a zero, quebrando assim o lao until.

O que achou at agora? Est fcil? Se quiser pare de ler, volte ou continue(fortes)... Alguns comandos para ajudar: echo read exit sleep clear reset date if case for while Imprime texto na tela Captura dados do usurio e coloca numa varivel Finaliza o script D uma pausa em segundos no script Limpa a tela Limpa todo o terminal ativo Mostra a hora do sistema. Pesquisar suas variveis. Controle de fluxo que testa uma ou mais expresses Controle de fluxo que testa vrias expresses ao mesmo tempo Controle de fluxo que testa uma ou mais expresses Controle de fluxo que testa uma ou mais expresses

Variveis especiais
$0 $1-$9 $# $* ou $@ $? Nome do script que est sendo executado Parmetros passados linha de comando Nmero de parmetros passados Mostra todos os parmetros passados Valor de retorno do ltimo comando ou de todo o shell script. ( true = 0 and false = 1)

Dica: Voc tambm encontra muitas variveis, j predefinidas, na pgina de manual do bash (comando man bash, seo Shell Variables). ;)

Funes Funes so blocos de comandos que podem ser definidos para uso posterior em qualquer parte do cdigo. Praticamente todas as linguagens usam funes que ajudam a organizar o cdigo. Vejamos a sintaxe de uma funo: funcao() { comando1 comando2 ... } Fcil de entender, no? A funo funcionar como um simples comando prprio. Voc executa a funo em qualquer lugar do script shell, e os comandos 1, 2 e outros sero executados. A flexibilidade das funes permite facilitar a vida do programador. Exemplo Final: #!/bin/bash # Exemplo Final de Script Shell principal() { clear echo "Exemplo Final sobre o uso de scripts shell" echo "------------------------------------------" echo "Opes:" echo echo "1. Trasformar nomes de arquivos" echo "2. Fazer backup dos arquivos do /usr/bin" echo "3. Sair" echo echo -n "Qual a opo desejada? " read OPCAO case $OPCAO in 1) transformar ;; 2) backup ;; 3) exit ;; *) "Opo invlida" principal ;; esac}

transformar() { clear echo -n "Para Maisculo ou minsculo? [M/m] " read VAR if [ $VAR = "M" ] then echo -n "Que diretrio? " read DIR for X in `/bin/ls` $DIR do Y=`echo $X | tr 'A-Z] [a-z]` if [ ! -e $Y ] then mv $X $Y fi done elif [ $VAR = "m" ] then echo -n "Que diretrio? " read DIR for X in `/bin/ls` $DIR do Y=` echo $X | tr 'A-Z] [a-z]` if [ ! -e $Y ] then mv $X $Y fi done else clear echo Opo invlida transformar fi } backup() { clear for X in `/bin/ls` /usr/bin do mkdir /usr/bin/backup cp -R /usr/$X /usr/$X.bck mv /usr/bin/$X.bck /usr/bin/backup done } principal;

Finalizando o mini curso Pronto! Agora a hora de colocar tudo em prtica e ver se realmente aprendeu. Faa os exerccios e envie para mim para serem corrigidos, no meu e-mail (chds_@hotmail.com), se quiser fazer perguntas tambm possvel. s escrever ou enviar o *.txt. ;) Alguns exigiro pesquisa e necessitaro de algumas ferramentas que foram apenas citadas, mas no aprendidas. O shelleiro tambm tem que aprender a se virar sozinho! (A) Exerccios propostos: 1) Faa um script que recebe dois nmeros como parmetro e mostra a relao entre eles. Exemplo: prompt$ ./relacao 3 5 3 menor que 5 prompt$ ./relacao 5 3 5 maior que 3 prompt$ ./relacao 5 5 5 igual a 5 prompt$ 2) Faa um script que recebe um nmero como parmetro e o diminui at chegar a zero, mostrando na tela cada passo, em uma mesma linha. Exemplo: prompt$ ./zerador 5 543210 prompt$ ./zerador 10 10 9 8 7 6 5 4 3 2 1 0 prompt$ Desafio final: 3) O script deve mostra na tela todos os parmetros recebidos na linha de comando, contando-os. Exemplo: prompt$ ./parametros a b c d e f Parmetro 1: a Parmetro 2: b Parmetro 3: c Parmetro 4: d Parmetro 5: e Parmetro 6: f prompt$ Dica: Use o for. :)

Good luck again!

Concluso Espero realmente que tenha aprendido as estruturas do shell-script e sua aplicao no universo UNIX. Sendo assim passo a ltima e mais importante de todas dicas: Nunca pare de estudar. ;) Espero seu sucesso!!!!!!! Da mesma forma que busco o meu.

Fontes: http://aurelio.net/ http://www.devin.com.br/shell_script/

Potrebbero piacerti anche