Você está na página 1de 10

Devin Programando em shell-script Print

http://www.devin.com.br/shell_script/print/

- Devin - http://www.devin.com.br -

Programando em shell-script
Posted By Hugo Cisneiros (Eitch) On 9 de agosto de 2004 @ 9:00 am In Programao, Tutoriais | 105 Comments

Uma vez fui convidado escrever para a Revista do Linux, e fiz alguns tutoriais que ensinam o bsico para quem est comeando a criar shell-scripts. Disponibilizo eles aqui.

Primeira parte, uma introduo


Quem usa Linux conhece bem o prompt de comando sh, ou variaes como o bash. O ue muita gente no sabe que o sh ou o bash tm uma poderosa linguagem de script embutido nelas mesmas. Diversas pessoas utilizam-se desta linguagem para facilitar a realizao de inmeras tarefas administrativas no Linux, ou at mesmo criar seus prprios programinhas. Patrick Volkerding, criador da distribuio Slackware, utiliza esta linguagem para toda a instalao e configurao de sua distribuio. Voc poder criar scripts para automar as tarefas dirias de um servidor, para efetuar backup automtico regularmente, procurar textos, criar formataes, e muito mais. Para voc ver como esta linguagem pode ser til, vamos ver alguns passos introdutrios sobre ela. 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 a Shell do sistema Linux. Usaremos o interpretador de comandos bash, por ser mais extenso que o sh, e para que haja uma melhor compreenso das informaes obtidas aqui, bom ter uma base sobre o conceito de lgica de programao.

[1]

O livro Shell Script Profissional [1] do Aurlio Marinho Jargas altamente recomendado para aqueles que j sabem um pouco de shell-script e querem se aperfeioar. Eu recomendo 100%!

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. Vamos seguir com um pequeno exemplo de um shell script que mostre na tela: Nossa! Estou vivo!: #!/bin/bash echo 'Nossa! Estou vivo!' Fcil, hein? A primeira linha indica que todas as outras linhas abaixo devero ser executadas pelo bash (que se localiza em /bin/bash), e a segunda linha imprimir na tela a frase Nossa! Estou vivo!, utilizando o comando echo, que serve justamente para isto. Como voc pde ver, todos os comandos que voc digita diretamente na linha de comando, voc poder incluir no seu shell script, criando uma srie de comandos, e essa combinao de comandos que forma o chamado shell script. Tente tambm dar o comando file arquivo e veja que a definio dele de Bourne-Again Shell Script (Bash Script). Contudo, para o arquivo poder se executvel, voc tem de atribuir o comando de executvel para ele. E como citamos anteriormente, o comando chmod se encarrega disto: $ chmod +x arquivo Pronto, o arquivo poder ser executado com um simples ./arquivo.

Conceito de Variveis em shell script


Variveis so caracteres que armazenam dados, uma espcie de atalho. O bash reconhece uma varivel quando ela comea com $, ou seja, a diferena entre palavra e $palavra que a primeira uma palavra

1 de 10

17-06-2011 16:23

Devin Programando em shell-script Print

http://www.devin.com.br/shell_script/print/

qualquer, e a outra uma varivel. Para definir uma varivel, utilizamos a seguinte sintaxe: variavel="valor" O valor ser atribudo a varivel . Valor pode ser uma frase, nmeros, e at outras variveis e comandos. O valor pode ser expressado entre as aspas (), apstrofos () ou crases (). As aspas vo interpretar as variveis que estiverem dentro do valor, os apstrofos lero o valor literalmente, sem interpretar nada, e as crases vo interpretar um comando e retornar a sua sada para a varivel. Vejamos exemplos: $ variavel="Eu estou logado como usurio $user" $ echo $variavel Eu estou logado como usurio cla $ variavel='Eu estou logado como usurio $user' $ echo $variavel Eu estou logado como usurio $user $ variavel="Meu diretrio atual o `pwd`" $ echo $variavel Meu diretrio atual o /home/cla Se voc quiser criar um script em que o usurio deve interagir com ele, possvel que voc queira que o prprio usurio defina uma varivel, e para isso usamos o comando read, que dar uma pausa no script e ficarar esperando o usurio digitar algum valor e teclar enter. Exemplo: echo "Entre com o valor para a varivel: " ; read variavel (O usurio digita e tecla enter, vamos supor que ele digitou 'eu sou um frutinha') echo $variavel eu sou um frutinha

Controle de fluxo com o 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, se no, irei fazer aquilo. Vamos dar um exemplo: if [ -e $linux ] then echo 'A varivel $linux existe.' else echo 'A varivel $linux no existe.' fi O que este pedao de cdigo faz? O if testa a seguinte expresso: Se a varivel $linux existir, ento (then) ele diz que que existe com o echo, se no (else), ele diz que no existe. O operador -e que usei pr-definido, e voc pode encontrar a listagem dos operadores na tabela: -eq Igual -ne Diferente -gt Maior -lt -o -d -e Menor Ou Se for um diretrio Se existir

2 de 10

17-06-2011 16:23

Devin Programando em shell-script Print

http://www.devin.com.br/shell_script/print/

-z -f -o -r -x

Se estiver vazio Se conter texto Se o usurio for o dono Se o arquivo pode ser lido Se o arquivo pode ser executado

-w Se o arquivo pode ser alterado

Outras alternativas
Existem inmeros comandos no Linux, e para explicar todos, teramos de publicar um verdadeiro livro. Mas existem outras possibilidades de aprendizado desta lngua, que tambm usado em todas as programaes. Primeiro de tudo voc pode dar uma olhada na manpage do bash (comando man bash), 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 novas em outros scripts e em manpages dos comandos. E por ltimo, mas no o menos importante, praticar bastante! Na tabela a seguir, voc pode encontrar uma listagem de comandos para usar em sua shell script: echo Imprime texto na tela read Captura dados do usurio e coloca numa varivel exit Finaliza o script sleep D uma pausa em segundos no script clear Limpa a tela stty tput if for Configura o terminal temporariamente Altera o modo de exibio Controle de fluxo que testa uma ou mais expresses Controle de fluxo que testa uma ou mais expresses

case Controle de fluxo que testa vrias expresses ao mesmo tempo while Controle de fluxo que testa uma ou mais expresses E assim seja, crie seus prprios scripts e facilite de uma vez s parte de sua vida no Linux!

Segunda parte, se aprofundando mais!


Falamos sobre o conceito da programao em Shell Script, e demos o primeiro passo para construir nossos prprios scripts. Agora vamos nos aprofundar nos comandos mais complicados, aprendendo a fazer programas ainda mais teis. Nestes comandos esto inclusos o case e os laos for, while e until. Alm disso, vamos falar de funes e, por ltimo, teremos um programa em shell script.

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 $1 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 $1 (que o primeiro parmetro passado para o programa), e comparou com valores exatos. Se a varivel $1 for igual parametro1, ento o programa executar o

3 de 10

17-06-2011 16:23

Devin Programando em shell-script Print

http://www.devin.com.br/shell_script/print/

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. Voc pode ver que, com o case fica muito mais fcil criar uma espcie de menu para o shell script do que com o if. Vamos demonstrar a mesma funo anterior, mas agora usando o if: if [ -z $1 ]; then echo "Voc tem de entrar exit elif [ $1 = "parametro1" ]; comando1 comando2 elif [ $1 = "parametro2" ]; comando3 comando4 else echo "Voc tem de entrar fi com um parmetro vlido" then

then

com um parmetro vlido"

Veja a diferena. muito mais prtico usar o case! A vantagem do if que ele pode testar vrias expresses que o case no pode. O case mais prtico, mas o if pode substitu-lo e ainda abrange mais funes. Note que, no exemplo com o if, citamos um comando no visto antes: o elif que uma combinao de else e if. Ao invs de fechar o if para criar outro, usamos o elif para testar uma expresso no mesmo comando if.

For
O lao for vai substituindo uma varivel por um valor, e vai executando os comandos pedidos. Veja o exemplo: for i in * do cp $i $i.backup mv $i.backup /usr/backup done Primeiramente o lao for atribuiu o valor de retorno do comando * (que equivalente a um ls sem nenhum parmetro) para a varivel $i, depois executou o bloco de comandos. Em seguida ele atribui outro valor do comando * para a varivel $1 e reexecutou os comandos. Isso se repete at que no sobrem valores de retorno do comando *. Outro exemplo: for original in *; do resultado=`echo $original | tr '[:upper:]' '[:lower:]'` 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.

While
O while testa continuamente uma expresso, at que ela se torne falsa. Exemplo:

4 de 10

17-06-2011 16:23

Devin Programando em shell-script Print

http://www.devin.com.br/shell_script/print/

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
Tem as mesmas caractersticas do while, 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 pra de executar os comandos quando chega ao done. Vejamos um exemplo para o until que, sintaticamente invertido, serve para o while tambm: var=1 count=0 until [ $var = "0" ]; do comando1 comando2 if [ $count = 9 ]; then var=0 fi count=`expr $count + 1` done Primeiro, atribumos varivel $var o valor 1. A varivel $count 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 $count for igual a 9. Se a varivel $count 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 $count, e quando chega em 9, a varivel $var igualada a zero, quebrando assim o lao until.

Usando vrios scripts em um s


Pode-se precisar criar vrios scripts shell que fazem funes diferentes, mas, e se voc precisar executar em um script shell um outro script externo para que este faa alguma funo e no precisar reescrever todo o cdigo? simples, voc s precisa incluir o seguinte comando no seu script shell: . bashscript2 Isso executar o script shell bashscript2 durante a execuo do seu script shell. Neste caso ele ser executado na mesma script shell em que est sendo usado o comando. Para utilizar outra shell, voc simplesmente substitui o . pelo executvel da shell, assim: sh script2

5 de 10

17-06-2011 16:23

Devin Programando em shell-script Print


tcsh script3

http://www.devin.com.br/shell_script/print/

Nessas linhas o script2 ser executado com a shell sh, e o script3 com a shell tcsh.

Variveis especiais
$0 $# $? $$ Nome do script que est sendo executado Nmero de parmetros passados Valor de retorno do ltimo comando ou de todo o shell script. (o comando exit 1 retorna o valor 1) Nmero do PID (Process ID)

$1-$9 Parmetros passados linha de comando

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, como no exemplo final.

Exemplo Final
Agora vamos dar um exemplo de um programa que utilize o que aprendemos com os artigos. #!/bin/bash # Exemplo Final de Script Shell Principal() { echo "Exemplo Final sobre o uso de scripts shell" echo "------------------------------------------" echo "Opes:" echo echo "1. Trasformar nomes de arquivos" echo "2. Adicionar um usurio no sistema" echo "3. Deletar um usurio no sistema" echo "4. Fazer backup dos arquivos do /etc" echo "5. Sair do exemplo" echo echo -n "Qual a opo desejada? " read opcao case $opcao in 1) Transformar ;; 2) Adicionar ;; 3) Deletar ;; 4) Backup ;; 5) exit ;; *) "Opo desconhecida." ; echo ; Principal ;;

6 de 10

17-06-2011 16:23

Devin Programando em shell-script Print


esac } Transformar() { 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 '[:lower:]' '[:upper:]'` 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 '[:upper:]' '[:lower:]'` if [ ! -e $y ]; then mv $x $y fi done fi } Adicionar() { clear echo -n "Qual o nome do usurio a se adicionar? " read nome adduser nome Principal } Deletar() { clear echo -n "Qual o nome do usurio a deletar? " read nome userdel nome Principal } Backup() { for x in `/bin/ls` /etc; do cp -R /etc/$x /etc/$x.bck mv /etc/$x.bck /usr/backup done } Principal

http://www.devin.com.br/shell_script/print/

Terceira parte, janelas graficas


Nos dois topicos anteriores, vimos algumas coisas bsicas e lgicas de programao em shell no Linux. Agora para completar, darei aqui dicas de como usar janelas grficas em seus shell-scripts. Isso mesmo, janelas que rodam no ambiente grfico, utilizadas facilmente em seu shell-script. Com esse recurso, vai ser possvel deixar o seu programa bem amigvel. No vai ser preciso saber muita coisa de programao em shell, pois muito simples. Atravs do programa Xdialog, voc poder criar os mais variados tipos de janelas para o programa: caixas de texto, selees, radios, etc. O Xdialog uma idia que vem do dialog/cdialog, um programa para console que gera janelas no

7 de 10

17-06-2011 16:23

Devin Programando em shell-script Print

http://www.devin.com.br/shell_script/print/

console (aquelas da instalao do Slackware) usando a biblioteca ncurses. O Xdialog ao invs de usar a biblioteca ncurses, usa a Xlib para criar as janelas no ambiente grfico. Primeiro de tudo ser necessrio voc obter o Xdialog no seu sistema. No comum o Xdialog estar incluso nas distribuies, ento voc ter de pegar e compilar o programa. Obtenha o programa no CD da Revista ou visite o endereo oficial do Xdialog, que http://xdialog.free.fr. Aqui eu peguei o arquivo Xdialog-1.4.5.tar.bz2, e agora vamos aos passos bsicos para instalar ele. Primeiro descompacte-o com o comando bunzip2 Xdialog-1.4.5.tar.bz2, e logo em seguida tar xpvf Xdialog-1.4.5.tar. Um diretrio chamado Xdialog-1.4.5 ser criado, e entrando nele voc estar pronto para compil-lo e instal-lo. Para fazer isso use os comandos ./configure, depois make e por ltimo make install. No passo do make install, o binrio do Xdialog ser colocado em /usr/local/bin. Pronto, agora voc j poder utilizar o Xdialog atravs de qualquer shell-script. E agora vamos ao! Como aprendemos nos artigos anteriores, em shell-script s colocar o comando dentro do arquivo que ele j vai ser executado quando o script for executado. Ento s o que temos de aprender aqui como usar o Xdialog. Vamos ver um primeiro exemplo: #!/bin/bash Xdialog --title "Exemplo nmero 1!" --center --stdout --yesno \ "Isto legal?" \ 0 0 echo $? Como voc pde ver, o programa Xdialog gerou uma janela com ttulo Exemplo nmero 1!, perguntando Isto legal? e com opes de Sim e No. Note que a \ (barra) serve para indicar shell para continuar o comando da linha seguinte, ento estas trs linhas so que nem uma s. Como ltimo comando do exemplo dado, temos o echo $?, que eu coloquei apenas para indicar qual foi o retorno da pergunta. Caso o usurio apertou em Sim, o retorno vai ser 0, e se apertou em No, vai ser 1. Podemos usar este retorno para controlar o que o usurio escolher. Vejamos um exemplo: Xdialog --title "Exemplo nmero 2!" --center --stdout --yesno \ "Neste exemplo, vamos ver o que voc quer fazer. Voc deseja continuar com o programa?" \ 0 0 if [ $? = "0" ]; then echo "Que bom! Voc continuou o programa! Parabns!" elif [ $? = "1" ]; then echo "Voc saiu do programa..." fi Viu como funciona? Agora vamos ver outros recursos que o Xdialog pode oferecer. Eu vou dar vrios exemplos aqui e sair comentando cada opo. Voc precisar praticar bastante e conhecer as vrias opes. Primeiro vamos gerar uma simples mensagem pro usurio ver: Xdialog --title "Aviso" --center --stdout --msgbox \ "Este programa apenas um exemplo para voc ver como o Xdialog \ \nfunciona. Apropsito, se voc praticar bastante pode criar \ \nprogra mas incrveis e facilmente, que daria muito mais \ \ntrabalho fazendo em outras linguagens." \ 0 0 O usurio aperta Ok e o shell-script continua normalmente. No primeiro exemplo eu usei a opo yesno que gerava o sim e no. Agora usei o msgbox. Mas e se voc quiser que o usurio digite algo e isto seja gravado em um arquivo por exemplo? Vamos ver este exemplo: Xdialog --title "Que Anime que voc mais gosta?" --center --inputbox \ "Se voc sabe o que Anime, e gosta, qual o seu preferido?\n \ Sua resposta ser gravada no arquivo resposta." \ 0 0 2> resposta

8 de 10

17-06-2011 16:23

Devin Programando em shell-script Print

http://www.devin.com.br/shell_script/print/

Depois que o usurio preenche o campo e d Ok, a resposta que este usurio digitou ser gravada no arquvio resposta. Isto ocorreu pelo fato de eu ter colocado o direcionador 2> para o arquivo resposta. Se eu colocasse a opo stdout na linha de comando do Xdialog, a resposta do usurio apareceria na tela. Tente voc. Vamos ver agora seleo de itens, que uma das coisas mais importantes num programa. Desta vez usaremos a opo menubox para gerar um menu com os itens a serem selecionados. Mais uma vez, vamos ao exemplo: Xdialog --title "Exemplo de Menu" --center --stdout --menubox \ "Qual sua distribuio Linux favorita?" \ 20 50 0 \ 1 "Slackware" \ 2 "Debian" \ 3 "Red Hat" \ 4 "Conectiva Linux" \ 5 "Eu tenho minha prpria distribuio" Viu como fcil? O que o usurio escolher vai aparecer como resultado no console (por causa da opo stdout). Se eu colocasse o redirecionador 2>, poderia ir para um arquivo como no exemplo anterior. Vamos esclarecer uma coisa aqui tambm Depois do texto Qual sua distribuio Linux favorita?, h 2 nmeros. Estes dois nmeros correspondem altura e comprimento da janela. Nos exemplos anteriores eu coloquei 0 0 pois a o Xdialog dimensiona automaticamente o tamanho da janela. Ento j sabe, se quiser mudar o tamanho da janela, s mudar estes dois nmeros. Agora como ltimo exemplo, vamos criar uma janela em que o usurio poder escolher uma ou mais opes. Isto chamado de checklist, e pode ser visto no exemplo a seguir: Xdialog --title "ltimo exemplo - checklist" --center --checklist \ "Como se pronuncia Linux?" \ 0 0 0 \ "Opo 1" "Linucs" off \ "Opo 2" "Lenocs" off \ "Opo 3" "Lincs" off \ "Opo 4" "Lnucs" on \ "Opo 5" "GNUUU/Linux" off Veja agora a diferena entre esta checklist e o menu do exemplo anterior. Verifique que depois de cada opo h o on e o off. O on indica que esta opo dever j estar marcada, e o off que no dever estar marcada. Se o usurio escolher 3 opes, as mesmas sero o resultado. Bem fcil criar uma interface amigvel para suas shell-scripts. Se voc pensa que isto tudo, ainda tem muito mais por trs do Xdialog. Para no ter que ficar comentando cada opo, vou dar uma lista de parmetros e a descrio de suas funes. O que voc dever fazer sair testando todas as opes e se impressionar :) yesno msgbox infobox Uma janela com opes de Sim ou No Apenas mostra um texto informativo Mesmo que msgbox, s que desaparece automaticamente em um determinado tempo

inputbox O usurio preenche um campo rangebox Escolhe um nmero entre X e Y, com uma barra de rolagem textbox editbox Mostra o contedo de um arquivo numa caixa de texto Edita o contedo de um arquivo numa caixa de texto

menubox Cria um Menu de opes, onde se seleciona um item checklist Mesmo que menubox, s que pode-se selecionar vrios itens radiolist treeview Mesmo que menubox, mas agora em outro estilo Opes organizadas em forma de rvore (interessante)

9 de 10

17-06-2011 16:23

Devin Programando em shell-script Print

http://www.devin.com.br/shell_script/print/

gauge tailbox fselect dselect timebox

Um indicador de processo Mostra o contedo de um arquivo Abre uma janela de seleo de um arquivo Abre uma janela de seleo de um diretrio Mostra uma janela para edio de horrio

calendar Mostra um calendrio para escolher uma data

Voc tambm pode encontrar alguns exemplos no diretrio samples que vem junto com o cdigo-fonte do programa. Se voc fizer algum programa legal em shell-script, sinta-se a vontade para me mandar um e-mail. Outra coisa, como o Xdialog uma idia tirada do dialog/cdialog (existe tambm o whiptail que parecido), voc pode usar a mesma sintaxe para criar estas janelas no modo console. Espero que estas informaes foram teis a voc e at a prxima :)

Article printed from Devin: http://www.devin.com.br URL to article: http://www.devin.com.br/shell_script/ URLs in this post: [1] Image: http://www.novatec.com.br/livros/shellscript/?idA=100

10 de 10

17-06-2011 16:23