Devin Com Br-Programando em Shell-Script PDF
Devin Com Br-Programando em Shell-Script PDF
br -
Programando em shell-script
Pos ted By Hugo Cisneiros (Ei tch) On 9 de agos to de 2004 @ 9:00 am In Program ação,
Tutoriais | 111 Comments
Uma vez fui convidad o à escrever pa ra a Revista do Linux, e fiz a lguns tutoriais que
ens inam o b ásico pa ra que m está começando a criar shell -scripts. Disponibil izo e les a qui.
Fácil, hein? A primeira linha indica que to das as outras linhas a baixo de verão s er
executada s pe lo bas h (que s e localiza e m /bin/bas h), e a se gunda linha imprimirá na te la
a frase “No ssa ! Estou viv o!”, utilizand o o comando echo, que s erve justamente para isto.
Como você pôde ver, todos os comandos q ue você digita dir etamente na linha de
comando , você p ode rá incluir no se u she ll script, criando uma s érie de comando s, e é es sa
combinação de comando s q ue forma o chamado she ll script. Tente também dar o comando
‘file arquivo’ e veja que a de finição dele é de Bourne -Again She ll Script (Bas h Script).
Contud o, para o a rquivo po der se executável, v ocê tem de a tribuir o comando de
executável pa ra ele. E com o citamos anteriorm ente , o comando chmod s e e ncarreg a disto:
$ chmod +x arquivo
Variáveis são caracteres qu e armazena m dad os, uma es pécie de ata lho. O bas h
reconhece uma variável quando ela começ a com $, ou seja, a d iferença e ntre ‘palavra’ e
‘$pa lavra’ é que a primeira é uma palavra qualque r, e a outra uma variável. Pa ra de finir
uma variável, util izamos a se guinte s intaxe:
variavel="valor"
O ‘valor’ se rá atribuí do a ‘variável ‘ . Valor pode ser uma frase, números, e a té o utras
variáveis e com ando s. O valor pode s er express ado e ntre as as pas (“”), apó strofos (”) ou
crase s (“). As asp as vão interpretar as variáveis que e stiverem dentro do valor, os
apó strofos lerão o valor li teralmente , sem interpretar nada , e as crases vão interpretar
um comando e retornar a sua s aída pa ra a variável.
Vejamos exemplos:
$ variavel="Eu estou logado como usuário $user"
$ echo $variavel
Eu estou logado como usuário cla
Se você quise r criar um script em que o us uário deve interagir c om ele, é po ssível que
você queira que o próprio usuá rio de fina uma vari ável, e para isso usamos o comando
read, que dará uma paus a no s cript e ficarará espe rando o usuário digitar al gum valor e
teclar enter. Exemplo:
echo "Entre com o valor para a variável: " ; read variavel
(O usuário digita e tecla enter, vamos supor que ele digitou 'eu sou um frutinha')
echo $variavel
eu sou um frutinha
Controle de flux o sã o comando s que vão te stand o algumas alternativas, e de acordo com
es sas alternativ as, vão exe cutando com ando s. Um dos comandos d e controle de flux o
mais usa dos é certamente o if, que é ba se ado n a lógica “se acontecer isso, ir ei faze r isso ,
se não, irei fazer aquilo”.
Vamos dar um exemplo:
if [ -e $linux ]
then
echo 'A variável $linux existe.'
else
echo 'A variável $linux não existe.'
fi
O que e ste pe daço de código faz? O if testa a se guinte express ão: Se a variável $linux
existir, então (then) ele diz que que existe com o echo, se nã o (else), ele diz que não
existe. O ope rador -e que use i é pré-defi nido, e voc ê po de e ncontrar a l istagem dos
operadores na tabela:
-eq Igual
-ne Diferent e
-gt Maior
-lt Menor
-o Ou
-d Se for um diretório
-e Se e xistir
-z Se es tiver vazio
-f Se conter texto
-o Se o u suário for o do no
-r Se o ar quivo po de se r lido
-w Se o ar quivo pode ser alterado
-x Se o ar quivo pod e ser ex ecutado
Outras alternativas
E as sim se ja, crie s eus próprios scri pts e facilite de uma vez só p arte de sua vida no
Linux!
Segunda parte, se aprofundando mai s!
Falamos sob re o conceito da programação em Shell Script, e de mos o primeiro pas so para
construir noss os próprios scri pts. Agora vam os no s ap rofundar nos comandos mais
complicados, aprende ndo a faze r programas ainda mais úteis. Neste s comando s es tão
inclusos o case e o s laços for, while e until. Além disso, vam os falar de funções e , por
último, te remos um prog rama em she ll script.
Case
O case é para controle de flux o, tal como é o if. Mas e nquanto o if testa express õe s não
exata s, o case vai agir de a cordo com os re sultados exatos . Vejamos um exem plo:
case $1 in
parametro1) comando1 ; comando2 ;;
parametro2) comando3 ; comando4 ;;
*) echo "Você tem de entrar com um parâmetro válido" ;;
esac
Aqui aconteceu o s eguinte: o case leu a variável $1 ( que é o primeiro parâmetro pass ado
para o p rograma), e comparou com valores exatos . Se a variável $1 for igual à
“parametro1″, então o programa executará o comando1 e o comando2; se for igual à
“parametro2″, executará o comando3 e o comando 4, e assim em diante. A última opção
(*), é uma opção padrão d o case, ou se ja, se o p arâmetro passa do nã o for igual a
nenhum a d as outras opções anteri ores, ess e comando será e xecutado automaticamente.
Você pod e ve r que, com o case fica muito mais fáci l criar uma es pécie de “menu” pa ra o
she ll script do que com o if. Vamos demonstrar a mesma função an terior, mas ago ra
usa ndo o if:
if [ -z $1 ]; then
echo "Você tem de entrar com um parâmetro válido"
exit
elif [ $1 = "parametro1" ]; then
comando1
comando2
elif [ $1 = "parametro2" ]; then
comando3
comando4
else
echo "Você tem de entrar com um parâmetro válido"
fi
Veja a diferença. É m uito mais prático usar o case ! A vantag em do if é que ele po de te star
várias e xpressõ es que o case nã o pod e. O case é mais prátic o, mas o if pode s ubstituí -lo
e a inda ab range mais funções. Note que, no exemplo com o if, citamos um “com ando ” não
visto a ntes: o elif – que é uma combinação de else e if. Ao invés de fechar o if para cr iar
outro, usamos o e lif para testa r uma e xpressã o no mes mo comando if .
For
O laço for vai subs tituindo uma variável por um v alor, e vai executando os comando s
pe didos. Veja o exempl o:
for i in *
do
cp $i $i.backup
mv $i.backup /usr/backup
done
Primeiramente o laço for atri buiu o valor de retorno d o comando “*” (que é equivalente a
um ls s em nenhum parâmetro) para a variável $i, dep ois exe cutou o bloco de comando s.
Em seguida e le atribui outro valor do com ando “*” pa ra a variável $1 e reexecutou o s
comandos. Isso se repete a té que não s obrem v alores de retorno do comando “*”. Outr o
exemplo:
for srcinal in *; do
resultado=`echo $srcinal |
tr '[:upper:]' '[:lower:]'`
if [ ! -e $resultado ]; then
mv $srcinal $resultado
fi
done
Aqui, o qu e o corre é a transform ação d e letras maiúsculas p ara minúsculas. Para cada
arquivo que o laço lê, uma vari ável cham ada $resultado irá conte r o a rquivo e m letras
minúsculas. P ara trans formar em letras mi núsculas, usei o comando tr. Caso não exista
um arquivo igual e com l etras minúsculas, o a rquivo é renomeado para o valor da variável
$resultado , de mes mo n ome, mas com letras minúsculas.
Como o s e xemplos ilustram, o laço for po de se r bem útil no tratamento de múltiplos
arquivos. Voc ê pode de ixá-los todos com letras mi núsculas ou maiúsculas se m precisar
renomear cada um m anua lmente , pode o rganizar dado s, faze r backup, entre outras
coisas.
While
O wh ile tes ta continuamente uma expressã o, até que e la se torne falsa. Ex emplo:
variavel="valor"
while [ $variavel = "valor" ]; do
comando1
comando2
done
O que acontece a qui é o se guinte: enquanto a “$variavel” for i gual a “valor”, o while
ficará executando o s comando s 1 e 2, até q ue a “ $variavel” não s eja mais i gual a “valor”.
Se no bloco dos comandos a “$variavel ” mudasse , o while iria pa rar de executar os
comandos quando chegass e em done, pois agora a e xpressã o $vari avel = “valor” não
se ria mais verdad eira.
Until
Tem as mes mas características do w hile, a ún ica diferença é que ele faz o contrário. V eja
o exemplo abaixo:
variavel="naovalor"
until [ $variavel = "valor" ]; do
comando1
comando2
done
Primeiro, atri buímos à variável “$var” o valor “ 1″. A variável “$count” se rá uma contage m
para qua ntas vez es quise rmos e xecutar o bl oco de comandos. O unti l executa os
comando s 1 e 2, enqua nto a variável “$var” for igual a “0″. Então us amos um if para
atribuir o valor 0 para a variável “$var”, se a variável “$count” for igual a 9. Se a variável
“$count” não for igual a 0, soma-se 1 a ela. Isso cria um laço que executa o comando 10
vezes, porque cada vez que o comando d o bloco de com andos é e xecutado, som a-se 1 à
variável “$count”, e quando chega e m 9, a variável “$var” é igualada a ze ro, que brando
as sim o laço un til.
Po de-se precisar criar vários scripts s hell que faze m funções diferente s, mas, e se você
precisar executar em um scr ipt shell um outro scri pt e xterno pa ra que es te faça a lguma
função e nã o precisar rees crever tod o o código? É simpl es , você s ó precisa incl uir o
se guinte com ando no se u script she ll:
. bashscript2
Isso e xecutará o scri pt she ll “ba shscript2″ durante a e xecução do se u script she ll. Nes te
caso e le será exe cutado na m es ma script shell em que e stá se ndo us ado o comando .
Pa ra utilizar outra she ll, você s implesmente s ubstitui o “.” pe lo executável da s hell, ass im:
sh script2
tcsh script3
Ness as linhas o script2 se rá executado com a she ll sh, e o script3 com a shell tc sh.
Variáveis especiais
Funções
Funções são blocos de comandos que podem ser defi nidos para uso posterior em
qualque r parte do código. Pratic amente toda s as linguagens u sam funções qu e ajudam a
organizar o código. V ejamos a s intaxe de uma funç ão:
funcao() {
comando1
comando2
...
}
Fácil de enten der, não ? A função funci ona rá como um sim ples comando próprio. V ocê
executa a função e m qualque r lugar do script she ll, e os comandos 1 , 2 e outros s erão
executado s. A flexibilidade das funçõe s permite facilitar a vida d o programador, com o n o
exemplo final.
Exemplo Final
echo $?
Como você p ôde ver, o programa Xdial og gerou uma jane la com título “ Exemplo número
1!”, perguntand o “Isto é lega l?” e com opç õe s de Sim e Não . Note que a \ (barra) serve
para indic ar à she ll para continuar o com ando da linha seguinte, então esta s três linhas
são que n em uma só . Como último comando do exemplo dado, temos o e cho $?, que eu
coloquei apen as pa ra indicar qual foi o retorno da pe rgunta. Caso o us uário apertou em
Sim, o retorno vai ser 0, e se ape rtou em Não, v ai ser 1. Pode mos us ar es te retorno p ara
controlar o que o usuá rio e scolher. V ejamos um exempl o:
Xdialog --title "Exemplo número 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! Parabéns!"
elif [ $? = "1" ]; then
echo "Você saiu do programa..."
fi
Viu como funciona ? Agora vamos ver outros recursos que o Xdialog pod e o ferecer. Eu vou
dar vários exemplos aqui e s air comentando cada op ção. Você precisará praticar bas tante
e conhe cer as várias o pções . Primeiro vamos g erar uma sim ples mensa gem pro usuá rio
ver:
Xdialog --title "Aviso" --center --stdout --msgbox \
"Este programa é apenas um exemplo para você ver como o Xdialog \
\nfunciona. Apropósito, se você praticar bastante pode criar \
\nprogra mas incríveis e facilmente, que daria muito mais \
\ntrabalho fazendo em outras linguagens." \
0 0
O us uário ape rta Ok e o s hell-script continua normal mente . No primeiro exe mplo eu use i a
opção –yesno qu e ge rava o sim e não . Agora usei o –msgbox. Mas e se você quiser que o
usuá rio digite algo e isto seja gravado e m um arquivo por exe mplo? Vamos ver este
exemplo:
Xdialog
"Se você--title "QueéAnime
sabe o que que
Anime, você mais
e gosta, gosta?"
qual --center --inputbox
o seu preferido?\n \ \
Sua resposta será gravada no arquivo resposta." \
0 0 2> resposta
Depois que o usuári o preenche o campo e dá Ok, a resposta que e ste usuá rio digit ou
se rá gravada no arquvio respos ta. Isto ocorreu pelo fato de e u ter colocado o
direcionad or 2> para o a rquivo resp osta . Se e u colocasse a opção –stdo ut na linha de
comando do Xdialog, a resp osta do us uário apareceria na tela. T ente você.
Vamos ve r agora s eleção d e itens, que é uma das coisas mais importantes num programa.
Desta vez usare mos a opção –menubo x para gerar um menu com os it ens a se rem
se leciona dos . Mais uma vez, vam os a o e xemplo:
Xdialog --title "Exemplo de Menu" --center --stdout --menubox \
"Qual sua distribuição Linux favorita?" \
20 50 0 \
1 "Slackware" \
2 "Debian" \
3 "Red
4 Hat" \Linux" \
"Conectiva
5 "Eu tenho minha própria distribuição"
Viu como é fácil? O que o us uário escolher vai aparecer com o res ultado no console (por
causa d a op ção –std out). Se eu colocasse o redireci ona dor 2>, poderia ir para um arquiv o
como no exemplo ante rior. Vamos e sclarecer uma coisa aq ui també m… Depois d o te xto
“Qual sua distribuição Linux favo rita?”, há 2 números . Este s dois números corres pondem
à altura e compri mento d a jane la. Nos e xemplos an teriores eu coloque i “0 0″ pois aí o
Xdialog dimens iona automatic amente o tamanho da janela. Então já sab e, se q uiser
mudar o tamanho da janela, é só mudar este s dois números.
Agora como últi mo e xemplo, vamos criar uma jane la em que o us uário pod erá e scolher
uma ou mais opçõe s. Isto é chamado de checklist, e pod e s er visto no exemplo a se guir:
Xdialog --title "Último exemplo - checklist" --center --checklist \
"Como se pronuncia Linux?" \
0 0 0 \
"Opção 1" "Láinucs" off \
"Opção 2" "Lenocs" off \
"Opção 3" "Linúcs" off \
"Opçào 4" "Línucs" on \
"Opção 5" "GNUUU/Linux" off
Veja ago ra a diferença entre e sta checkl ist e o menu do exemplo anterior. Verifique q ue
depois de cada opção há o on e o off. O on in dica que esta o pção deverá já estar
marcada, e o off que não d everá e star marcada. Se o usuário escolher 3 opções , as
mesmas se rão o resultado.
Bem fácil criar uma interfac e amigável p ara s uas she ll-scripts. Se você pe nsa que isto é
tudo, ainda tem muito mais por trás do Xdialog. Para nã o te r que ficar comenta ndo cada
opção , vou dar uma l ista de pa râmetros e a de scrição de s uas funções . O que você
deverá fazer é sa ir testando toda s as opções e se impressionar : )
Você também pode e ncontrar alguns exemplos no diretório sa mples q ue ve m junto com o
código-fonte do programa. S e você fizer algum program a legal e m shell-script, sinta-se a
vontade para me mandar um e-m ail. Outra coisa, com o o Xdialog é uma idé ia tirada do
dialog/cdialog
sintaxe para cri(exi ste ta mbém
ar estas o wnhiptail
“janelas” o modo que é pole.
cons arecido),
Esperovocê
quepeode
stasusar a mes
inform maforam
ações
úteis a você e até a próxima :)