Anda di halaman 1dari 69

Shell S

ript para Ini iantes


Piter PUNK
a.k.a. Roberto Freires Batista

2004

Sumrio

Conhe endo o BaSH

1.1
1.2
1.3
1.4
1.5
1.6

Prompt, omando... . . . . . . . . . . . . . . . . . . . . . . . . . . .
Juntando omandos... . . .
Variveis e aspas... . . . .
Redire ionando... . . . . .
Um pou o de aritmti a...
...e um pou o de lgi a . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

Programando

2.1
2.2
2.3
2.4
2.5

Separando o Joio do Trigo... . . .


A estrutura de um shell s ript . .
Passando parmetros para os seus
De novo! . . . . . . . . . . . . . .
Extra! Extra! . . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

. . . .
. . . .
s ripts
. . . .
. . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

5
. 5
. 6
. 9
. 10
. 12

.
.
.
.
.

14

14
16
18
20
23

Trabalhando om Textos

26

Aparn ia Tudo...

38

3.1
3.2
3.3

4.1
4.2
4.3
4.4
4.5

Sele ionando textos . . . . . . . . . . . . . . . . . . . . . . . . . . . 26


Organizando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Editando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

O mtodo COBOL . . . . . . .
O mtodo riptogr o . . . . .
O bom e velho linha e oluna
O menu de bolso . . . . . . . .
Usando Dialog . . . . . . . . . .

Trabalhando one tado

5.1
5.2

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

38
39
41
42
42

47

Mandando e-mails . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Tro ando arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2.1 HTML... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
1

SUMRIO

A Usando O editor de textos: VI

A.1 Des revendo o VI... . . . . . . . . .


A.2 Editando textos... . . . . . . . . . .
A.2.1 Navegando pelo texto . . . .
A.2.2 Mar ando textos . . . . . .
A.2.3 Apagando . . . . . . . . . .
A.3 Saindo do VI e outros adi ionais... .
A.3.1 Sair do VI . . . . . . . . . .
A.3.2 Lendo um arquivo no VI . .
A.3.3 Substituies . . . . . . . .
A.4 Conguraes... . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

B Comandos teis...

B.1 ...para manipular arquivos... . . . . . . . . . . . . . . . . . . . . .


B.1.1 ls - Listar arquivos . . . . . . . . . . . . . . . . . . . . . .
B.1.2 rm - Remover arquivos . . . . . . . . . . . . . . . . . . . .
B.1.3 mv - Movendo e Renomeando arquivos . . . . . . . . . . .
B.1.4 p - Copia arquivos . . . . . . . . . . . . . . . . . . . . . .
B.1.5 le - des obre o tipo do arquivo . . . . . . . . . . . . . . .
B.1.6 mkdir - Cria diretrio . . . . . . . . . . . . . . . . . . . . .
B.2 ...para trabalhar om textos... . . . . . . . . . . . . . . . . . . . .
B.2.1 at - O texto na tela . . . . . . . . . . . . . . . . . . . . .
B.2.2 head - Mostra o in io do arquivo . . . . . . . . . . . . . .
B.2.3 tail - Mostra o nal de um arquivo . . . . . . . . . . . . .
B.2.4 grep - En ontrando o que se pro ura . . . . . . . . . . . .
B.2.5 ut - Corta um pedao do texto . . . . . . . . . . . . . . .
B.2.6 sort - Ordena um texto . . . . . . . . . . . . . . . . . . . .
B.2.7 tr - tro a ara teres . . . . . . . . . . . . . . . . . . . . . .
B.2.8 fold - enquadra textos . . . . . . . . . . . . . . . . . . .
B.3 ...sobre o sistema e... . . . . . . . . . . . . . . . . . . . . . . . . .
B.3.1 ps - mostra os pro essos no sistema . . . . . . . . . . . . .
B.3.2 free - informaes sobre a memria do sistema . . . . . . .
B.3.3 uname - identi ao do sistema . . . . . . . . . . . . . . .
B.3.4 date - a data do sistema . . . . . . . . . . . . . . . . . . .
B.3.5 mount - Vendo os sistemas de arquivos montados . . . . .
B.4 ...para outras oisas . . . . . . . . . . . . . . . . . . . . . . . . . .
B.4.1 ping - Veri a se uma determinada mquina est viva . . .
B.4.2 m ookie - Gera um digo (teori amente) ni o . . . . . .
B.4.3 z at - mostra um arquivo ompa tado om o gzip . . . . .
B.4.4 zgrep - pro ura por um texto no interior de um arquivo ompa tado om o gzip . . . . . . . . . . . . . . . . . . . . . .

53

53
53
54
54
55
55
55
55
56
56

58

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

58
58
59
59
60
60
60
61
61
61
61
61
62
62
63
63
63
63
64
65
65
66
66
66
67
67

. 67

SUMRIO

B.4.5 tee - es reve algo na sada padro e em um arquivo ao mesmo


tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Captulo 1
Conhe endo o BaSH
Bem-vindos ao urso de shell s ript. Vamos omear mostrando um pou o o nosso
grande ompanheiro, o Bourne Again SHell (um tro adilho em homenagem ao
riador do sh original, Steven Bourne), onhe ido tambm omo bash. O bash
ompatvel om a sh original, assim omo a Korn Shell (ksh) e a Z Shell (zsh). No
mundo *NIX, existe uma segunda famlia de shells, des endente da sh, om uma
sintaxe razoavelmente diferente. Ex eto prova em ontrrio, a sintaxe revelada
aqui referente ao bash.
A prin ipal utilidade de uma shell fazer om que vo possa utilizar o sistema
opera ional. a shell que l e interpreta os seus omandos, e ento l os outros
programas ou realiza a operao soli itada (ou um mix destes dois). Sem a shell, o
omputador seria muito pou o til (vamos lembrar que alguns sistemas de janelas,
omo o X Window System, so uma esp ie de shell, em que os omandos so
substitudos por hieroglifos, em um retorno aos tempos do Antigo Egito).
No existe vida omo ns a onhe emos fora da shell. Alm das suas bordas, vivem programas malvados e sinais ines rupulosos, vidos pelo sangue de
ino entes. Mas, dentro da shell a vida feliz, os usurios exe utam os seus omandos, os programadores seus ambientes de programao repletos de makes,
s, auto onfs, et ... E os administradores regem todo este sistema harmni o,
atravs de omandos abalsti os e s ripts msti os...
O objetivo do urso fazer om que vo onsiga riar estes s ripts e automatizar as suas tarefas, fa ilitando a sua vida. O shell s rip t um linguagem poderosa,
j que une o bash vasta gama de utilitrios presentes em um sistema *NIX. E a
sintaxe utilizada para o bash extremamente simples.

CAPTULO 1.

1.1

CONHECENDO O BASH

Prompt, omando...

Um dos primeiros usos para a shell ser utilizada omo me anismo de entrada e
sada, ns passamos omandos para o sistema atravs da shell, e os omandos nos
retornam suas sadas por ela. Um bom exemplo disto est logo a seguir, onde
exe utado o omando ls om a opo -la e retornada a listagem dos arquivos
deste diretrio:

punkra hael:~/lala$ ls -la


total 12
drwxr-xr-x
2 punk
users
drwx--x--x 95 punk
users
punkra hael:~/lala$

4096 2003-12-08 00:27 ./


8192 2003-12-07 22:28 ../

Neste pequeno exemplo j podemos identi ar um grande elemento do shell, o


prompt. O prompt pode ser diferente de shel l para shell e alterado at mesmo
enquanto estamos utilizado a shell, ele serve para indi ar que o sistema est pronto
para re eber o prximo omando. No exemplo a ima, o prompt : punkra hael:/lala$.
Normalmente o prompt simbolizado por um # ou $.
O segundo elemento que vemos o omando a ser exe utado. Para um urso
omo este, interessante que o aluno esteja familiarizado om alguns omandos
bsi os omo o ls, who, ps, et ... aso ontrrio, pode ser que ele que boiando.
Boa parte dos omandos a ser utilizados seguem a seguinte sintaxe:

omando -opes --opes-gnu argumento1 argumento2 ... argumentoN


As partes obrigatrias a so o omando e o argumento1 (e, dependendo do omando em questo, o argumento2). O restante op ional, e utilizado de a ordo
om o efeito nal que queremos dar ao omando.

1.2

Juntando omandos...

A losoa *NIX a de que devem existir vrios pequenos omandos e que unio
deles gere efeitos poderosos. Por exemplo, o ls serve para listar todos os arquivos
de um determinado diretrio. Mas existem alguns diretrios que possuem uma
quantidade interminvel de arquivos... omo /usr/bin por exemplo. Para visualizar todos os arquivos deste diretrio iramos pre isar de um paginador, para que
pudssemos ver uma pgina de ada vez...
A que entra a idia de juntar os omandos, utilizando pipes ns podemos
dire ionar a sada de um omando diretamente para outro:

CAPTULO 1.

CONHECENDO O BASH

$ ls /usr/bin | less
Pronto! Com o uso de um pipe (representado pelo |), redire ionamos a sada
do ls para um less, que um paginador. Poderamos fazer algo semelhante
para des obrir quantos diretrios temos em um outro determinado diretrio... por
exemplo

$ ls -l ~/ | grep - d
Neste aso, a sada do omando ls est sendo passada ao grep. Como isto est
fun ionando? Primeiramente, listado o diretrio HOME do usurio (o HOME
representado por um /), todos ns sabemos que quando utilizada a opo -l,
mostrada uma listagem detalhada, em que, entre outras oisas, temos a informao
da natureza de um arquivo, um diretrio identi ado por um d, na primeira
posio da linha em que apare e o arquivo. este d que estamos ontando om
o omando grep.

1.3

Variveis e aspas...

O prompt, que ns vimos na seo 1.1 uma varivel do sistema. Vo pode


mudar o prompt para o que vo quiser. Algumas pessoas gostam de olo ar o
nome delas no prompt, outras gostam de olo ar o nome do omputador em que
elas esto trabalhando... outras ainda gostam de olo ar estes e mais zilhes de
informaes, enquanto existem alguns que vivem felizes om apenas um ifro ou
um sustenido omo prompt.
Podemos ver o ontedo de uma varivel om o omando e ho, que serve para
mostrar alguma informao na tela, omo o ontedo de variveis e textos:

punkra hael:~$ e ho $PS1


\u\h:\w\$
Por in rvel que parea, este \u\h:\w\$ o prompt. O \u o nome do usurio,
o \h o host (ou mquina) em que ele est, o \w serve para mostrar o diretrio de
trabalho e o \$ um indi ador,  a $ quando se est usando um usurio omum
e tro a para # quando o root do sistema. O  e o : so apenas um  e um :
mesmo.
Dar um valor para uma varivel extremamente simples, basta fazer:

punkra hael:~$ PS1="umdoistrs "


umdoistrs e ho $PS1
umdoistrs
umdoistrs

CAPTULO 1.

CONHECENDO O BASH

Pronto! Demos varivel PS1 (que o prompt ) o valor de umdoistrs  que, digase de passagem, um nome horrvel para um prompt. Outra varivel de sistema
interessate o $HOME, que indi a onde o diretrio pessoal de determinado
usurio, podemos fazer:

umdoistrs e ho $HOME
/home/punk
Podemos tambm dizer que:

umdoistrs e ho "O prompt do $USER $PS1 e o seu home $HOME"


O prompt do punk umdoistrs e o seu home /home/punk
Agora... e se quisssemos es rever $HOME? Como fazer? Simples, poderamos
apenas mudar as aspas que estamos utilizando...

umdoistrs e ho '$HOME a varivel que guarda o home de um usurio'


$HOME a varivel que guarda o home de um usurio
Mas, om isso, temos de novo um problema... e para olo ar na mesma sada a
palavra $HOME e o ontedo da varivel HOME? Uma soluo seria o uso ra ional
das aspas...

umdoistrs e ho '$HOME='$HOME
$HOME=/home/punk
Ou ento no uso do \, que um ara ter de es ape, isso faz om que o
interprete o ara ter que vem logo depois do \:

shell no

umdoistrs e ho "\$HOME=$HOME"
$HOME=/home/punk
Questo de gosto, e de momento. Podemos tambm riar novas variveis, om
ontedos variados... por exemplo:

umdoistrs MEU_NOME="Punk"
umdoistrs e ho $MEU_NOME
Punk
Mas, s vezes, queremos que uma varivel assuma o valor de um omando... Por
exemplo, podemos fazer:

CAPTULO 1.

CONHECENDO O BASH

umdoistrs uname
Linux
E om isso sabemos sob qual Sistema Opera ional estamos rodando. Talvez valha
a pena guardar essa informao para ser utilizada um s ript. Se vale a pena, vamos
armazenar a sada do omando uname em um varivel (iremos hamar esta varivel
de SO).

umdoistrs SO=`uname`
umdoistrs e ho $SO
Linux
Per eba o uso que demos s ` `, om elas podemos pegar a sada da exe uo de um
omando. Para diminuir a onfuso e fa ilitar a leitura, muita gente tem utilizado
uma sintaxe mais nova, que substitui as ` `, por $():

umdoistrs SO=$(uname)
umdoistrs e ho $SO
Linux
Por onveno, as variveis normalmente so es ritas em mais ulas, para  arem
desta adas em meio ao texto do s ript (que es rito em mins ulas). Tambm
so utilizadas as haves {} para delimitar uma varivel, por exemplo:

umdoistrs SO2="nada"
Agora, desejamos es rever Linux2, utilizando a varivel SO que j tnhamos
denida:

umdoistrs e ho $SO2
nada
A entram as haves:

umdoistrs e ho ${SO}2
Linux2
Se este uso no su iente, as haves podem ter uma utilidade muito mais nobre,
vamos pensar na sada do omando uname -a:

umdoistrs uname -a
Linux ra hael 2.4.22 #6 Tue Sep 2 17:43:01 PDT 2003 \
i686 unknown unknown GNU/Linux

CAPTULO 1.

CONHECENDO O BASH

A esto todos os dados disponveis sobre a mquina na qual estamos, qual o


sistema opera ional, qual o nome dela, qual a verso, quando foi ompilado, et ...
Podemos querer enderear ada um deles e no apenas o primeiro... para estes
asos, existe omo fazer vetores em bash:

umdoistrs UNAME=(`uname -a`)


umdoistrs e ho ${UNAME[1}
ra hael
Ateno para o uso:
1. das aspas invertidas na denio do vetor UNAME. Em bash, ada um vetor
ini ializado omo uma srie de valores, separadas por espao dentro de ().
Como a sada do omando uname j separada por espaos, basta utilizar
ela mesma, exe utando o omando entre `.
2. das haves ao passar o elemento do vetor. Sem elas, o shell iria apresentar o
ontedo de UNAME e, ao lado, um [1 meio perdido.

1.4

Redire ionando...

Outro re urso interessante do shell o de dire ionar a sada de um omando para


um arquivo. Por exemplo, podemos fazer:

punkra hael:~$ e ho Walla > arquivo_teste


punkra hael:~$ at arquivo_teste
Walla
Ou seja, a sada do omando e ho, ao invs de apare er na tela, apare eu diretamente no arquivo que sele ionamos aps o > (arquivo_teste). Preste bastante
ateno no >, e ver que ele se pare e muito om uma seta, indi ando o uxo para
onde vai a informao.
Uma pequena experin ia:

punkra hael:~$ e ho Salim > arquivo_teste


punkra hael:~$ at arquivo_teste
Salim
Pudemos ver que o > sobres reve o arquivo anterior, se ele existir. Ou seja, uma
pssima idia para um arquivo de logs, onde devemos sempre a res entar alguma
informao em um arquivo que j existe. Para fazer esse tipo de oisa, existe o
omando > >, omo vemos abaixo:

CAPTULO 1.

CONHECENDO O BASH

10

punkra hael:~$ at arquivo_teste


Salim
punkra hael:~$ e ho slovoboda > > arquivo_teste
punkra hael:~$ at arquivo_teste
Salim
slovoboda
Ta-d! Colo amos os dados logo abaixo no nosso arquivo! Se fosse s isso, esse re urso de redire ionar para arquivo j iria ser a oitava maravilha do mundo moderno
mas, omo diziam os omer iais do 1406, no s isso!
Podemos usar os sinais de < e < < omo entrada de dados tambm!!!

punkra hael:~$ e ho "texto todo em mins ulas" > arquivo_teste


punkra hael:~$ tr a-z A-Z < arquivo_teste
TEXTO TODO EM MINSCULAS
O omando tr, substitui uma adeia de ara teres por outra. No nosso aso, substitumos as letras mins ulas a-z, pelas mais ulas A-Z. E, omo visto, utilizamos
o ontedo do arquivo arquivo_teste omo entrada. Podemos usar tambm o
< <, omo veremos abaixo:

punkra hael:~$ sh < <EOF


> at /et /passwd | grep ^root
> EOF
root:x:0:0::/root:/bin/bash
Quando dizemos < <EOF estamos avisando para ele usar omo entrada tudo que
es revermos, at hegar um EOF (End Of File ). Ento, o que dissemos no omando
a ima foi: exe ute o sh, e use omo entrada para ele os dados que forem sendo
es ritos at hegar um EOF. Ateno para o >, que onhe ido omo PS2, e o
segundo prompt do shell (o PS1 a gente j sabe qual ...)

1.5

Um pou o de aritmti a...

Temos variveis, redire ionamentos, atribuies... mas ainda no temos omo fazer
um simples 2+2. Experimente:

punkra hael:~$ 2+2


-bash: 2+2: ommand not found

CAPTULO 1.

CONHECENDO O BASH

11

No bem assim que vamos onseguir fazer nossas operaes matemti as mas,
se este no o modo de realizar, qual seria?
O primeiro e mais tradi ional o uso de alguns omandos externos, omo o
expr e o b . Podemos ver o uso dos dois logo abaixo:

punkra hael:~$ expr 2 + 2


4
punkra hael:~$ e ho 2+2 | b -l
4
O b um pou o mais dif il de trabalhar, sendo que pre isamos passar a expresso
matemti a para ele via pipe... ou via arquivo. Mas ele muito mais poderoso
que o expr, que possui algumas limitaes irritantes:
1. S faz operaes om inteiros e
2. No a eita a multipli ao om o *, sendo ne essrio utilizar \*
Uma ter eira maneira utilizar $(()), podemos ver seu uso na linha abaixo:

punkra hael:~$ e ho $((2+2))


4
O $(()) a eita vrias operaes omo: adio (+), subtrao (-), diviso (/), resto
(%), multipli ao (*), exponen iao(**) alm de vrias operaes lgi as, omo
E (&), OU (|), shifts (< < e > >), et ...
A outra maneira bem familiar para os usurios de BASIC, onsiste no uso do
omando let:

punkra hael:~$
punkra hael:~$
punkra hael:~$
punkra hael:~$
3

a=1
b=2
let a=a+b
e ho $a

Todas as operaes apresentadas para o $(()) valem para o let, e vrias outras
que no esto expli itadas aqui. Muita ateno que o let, ao ontrrio de todos
os outros omandos, no referen ia a varivel por $VARIVEL e sim, apenas por
VARIVEL. Cuidado para no esque er.

CAPTULO 1.

1.6

CONHECENDO O BASH

12

...e um pou o de lgi a

Temos operaes lgi as permitidas pelos omandos matemti os, mas tambm
temos duas funes importantes embutidas no bash, E e OU. Podemos utilizar
estas duas funes, para sele ionar quais omandos devemos exe utar, por exemplo:

punkra hael:~$ ping - 1 www.linux.org && e ho 'Rede OK!' ||\


e ho 'Rede Suxou!'
PING www.linux.org (198.182.196.56) 56(84) bytes of data.
64 bytes from www.linux.org (198.182.196.56): i mp_seq=1 ttl=38 time=369 ms
--- www.linux.org ping statisti s --1 pa kets transmitted, 1 re eived, 0% pa ket loss, time 0ms
rtt min/avg/max/mdev = 369.214/369.214/369.214/0.000 ms
Rede OK!
A resposta est meio suja, mas podemos entender o omando dado:

ping - 1 www.linux.org -> Envia um ping para www.linux.org, o - 1


serve para que seja enviado um e apenas um ping e depois disso o programa
pare
&& -> o nosso E, om ele ns dizemos que o prximo omando s ser
exe utado se o anterior for bem su edido
e ho 'Rede OK!' -> Informa que a rede est OK, j que o omando ping
foi bem su edido.
|| -> Se o omando anterior no foi bem su edido, ser exe utado o prximo
omando, ou seja OU um OU o outro.
e ho 'Rede Suxou!' -> Avisa que a rede est suxada. Isso a onte e, fazer
o qu? C'est la vie...
Se quisermos deixar o resultado desta nossa linha de omando um pou o mais
simpti a, podemos fazer um redire ionamento da sada do ping para outro lugar...
por exemplo:

punkra hael:~$ ping - 1 www.linux.org >/dev/null && \


e ho 'Rede OK!' || e ho 'Rede Suxou!'
Rede OK!

CAPTULO 1.

CONHECENDO O BASH

13

Este >/dev/null dire iona a sada do ping para lugar nenhum. para onde vo
vrias oisas, omo as re lamaes que fazemos em all- enters e requisies ao
administrador da rede, lembrem-se quando forem administradores de redire ionar
todos os e-mails de usurios para o /dev/null.
Ao pingar um host que no existe, normalmente temos um erro:

punkra hael:~$ ping www.plmo.ogre


ping: unknown host www.plmo.ogre
E, na nossa linha de omando tambm...

punkra hael:~$ ping - 1 www.plmo.ogre >/dev/null && \


e ho 'Rede OK!' || e ho 'Rede Suxou!'
ping: unknown host www.plmo.ogre
Rede Suxou!
Dois problemas: o primeiro que a nossa linha de omando no fun iona direito
quando pingamos algum servidor que no existe, mas isso se resolve pingando
mquinas existentes; o segundo mais grave... a mensagem de erro saiu no meio
de tudo e sujou de novo a nossa tela, mesmo om o redire ionamento...
Isso a onte e porque existem dois anais de sada: o stderr (2) e o stdout (1).
Sendo que um a sada de erros e o outro a sada de mensagens. Podemos
redire ionar os dois para o /dev/null:

punkra hael:~$ ping - 1 www.plmo.ogre 2>/dev/null 1>/dev/null \


&& e ho 'Rede OK!' || e ho 'Rede Suxou!'
Rede Suxou!
Ou fazer isso om os dois ao mesmo tempo:

punkra hael:~$ ping - 1 www.plmo.ogre &>/dev/null \\


&& e ho 'Rede OK!' || e ho 'Rede Suxou!'
Rede Suxou!
Tambm podemos redire ionar um para o outro, o que pode ser til algumas vezes.
Isso se faz om 2>&1, por exemplo.

Captulo 2
Programando
Ainda no a programao prpriamente dita, neste aptulo iremos dar uma rpida passagem pelas estruturas de iterao e seleo do bash, alm de uma pin elada
em outras reas do onhe imento ar ano. Depois de onhe er estas estruturas, vamos olo -las seqen ialmente em arquivo, o resultado desse pro esso o nosso
shell s ript.

2.1

Separando o Joio do Trigo...

Bom, o mtodo mais primitivo de seleo utilizando o && e o ||, se o omando


anterior foi bem su edido, faa alguma oisa, se no foi, no faa. Isso pode ser
um pou o in rementado om o uso do [ (que s vezes um link para o omando
test). Veja o exemplo abaixo:

punkra hael:~$ a=1 ; b=2


punkra hael:~$ [ $a = $b && e ho iguais || e ho diferentes
diferentes
punkra hael:~$ [ ! $a = $b && e ho diferentes || e ho iguais
diferentes
No primeiro veri amos se a varivel a igual varivel b e no segundo veri amos
o oposto disto.
Podemos utilizar uma variedade interminvel de testes omo por exemplo:

punkra hael:~$ [ "`ls GNUstep`" && e ho O diretrio existe


O diretrio existe
punkra hael:~$ [ "`ls GNUstepa`" && e ho O diretrio existe
/usr/bin/ls: GNUstepa: No su h file or dire tory
14

CAPTULO 2.

PROGRAMANDO

15

punkra hael:~$ [ "`ls GNUstepa &>/dev/null`" && e ho O diretrio existe


punkra hael:~$
punkra hael:~$ [ -e GNUstep && e ho O diretrio existe
O diretrio existe
Vimos o teste utilizando um omando, um teste dando errado, um teste utilizando
o -e, um teste om um redire ionamento... isso d para ter um breve idia do
quanto esses testes so teis e poderosos...
O prximo passo, utlizar a trin a if...then...fi, omo vamos ver logo
abaixo:

punkra hael:~$ if [ "$USER" = "punk" ; then e ho "Oi Punk"; fi


Oi Punk
Para quem est a ostumado a ver isto de maneira mais estruturada, podemos
fazer:

punkra hael:~$ sh < <EOF


> if [ "$USER" = "punk" ; then
>
e ho "Oi Punk"
> fi
> EOF
Oi Punk
Que semelhante ao formato que isto ter quando apare er no seu s ript. Podemos
ainda olo ar alguns penduri alhos no if...then...fi, omo o else:

punkra hael:~$ sh < <EOF


> if [ "$USER" = "punk" ; then
>
e ho "Oi Punk"
> else
>
e ho "No o Punk!"
> fi
> EOF
Oi Punk
Alm do if...then...else...fi, temos outra estrutura de seleo muito interessante, o ase, podemos dizer que ele uma esp ie de superif. Ele permite que
omparemos uma varivel om muitos valores de uma vez s... por exemplo:

CAPTULO 2.

16

PROGRAMANDO

ase $OPCAO in
1)
e ho "Vo es olheu 1"
;;
2)
e ho "Vo es olheu 2"
;;
*)
e ho "Vo no es olheu nem 1 nem 2"
exit
;;
esa
A varivel OPCAO est sendo omparada om os valores 1 e 2. Caso seja es olhida
uma destas opes, o omando e ho ir mostrar na tela a opo es olhida. Se
no for nem 1 e nem 2, ser apresentada a mensagem Vo no es olheu nem
1 nem 2. isso que quer dizer aquele *: qualquer opo que no seja nenhuma
das anteriores.
Mas a estrutura do ase muito omprida... a ho que j est na hora de
passarmos a es rever estes omandos dentro de algum arquivo.... o resultado disso
sero os nossos shell s ripts propriamente ditos.

2.2

A estrutura de um

shell s ript

Primeiro, abra o seu editor de textos favorito (VIm! VIm! VIm!), ou talvez, se
o seu editor favorito no estiver disponvel, algum outro (elVIs! elVIs! elVIs!).
O que interessa que vo saiba editar um texto nele. Agora vamos omear de
verdade...
Em todo shell s ript, a primeira linha deve ser:

#!/bin/sh
Onde o /bin/sh a shell utilizada para interpretar o s ript. Por exemplo, se
vo estiver om um sh s ript e quiser rodar no bash, o sh s ript dever ter na
primeira linha algo do tipo:

#!/bin/ sh
Como todos os nossos s ripts so ompatveis om o bash, utilize /bin/bash ou
/bin/sh (que na maior parte dos Linux um link para o /bin/bash). Depois desta

CAPTULO 2.

PROGRAMANDO

17

linha, vem o s ript propriamente dito, om todos os seus omandos, estruturas e


omentrios.
Agora podemos tentar fazer algo de til om o ase que vimos um pou o a ima,
es reva o programa abaixo no seu editor de textos e salve omo s ript1:

#!/bin/sh
e ho 1) Opo 1
e ho 2) Opo 2
read OPCAO
ase $OPCAO in
1)
e ho "Vo es olheu 1"
;;
2)
e ho "Vo es olheu 2"
;;
*)
e ho "Vo no es olheu nem 1 nem 2"
exit
;;
esa
Pronto! Agora temos um maravilhoso shell s ript. Antes de exe ut-lo, interessante dar a ele a permisso de exe uo, isso feito om o omando:

punkra hael:~$ hmod +x s ript1


Agora pode exe utar...

punkra hael:~$ ./s ript1


1) Opo 1
2) Opo 2
1
Vo es olheu 1
O omando e ho imprime na tela a lista de opes que queremos, e o read serve
para que a possamos ler a resposta do usurio. No nosso aso, a resposta
guardada na varivel OPCAO, que depois interpretada pelo ase.
Por enquanto os nossos s ripts so extremamente urtos ( o que a onte e normalmente om s ripts para ini iantes... so todos urtos -;)), mas no ser assim
para sempre, podemos fazer um s ript om vrias e vrias funes... dzias de
variveis e estruturas insanas... quando isso a onte er, vo vai pre isar omentar
os seus programas... Vamos fazer isso om o programa que a abamos de es rever:

CAPTULO 2.

PROGRAMANDO

18

#!/bin/sh
#
# s ript1 - O primeiro s ript a gente nun a esque e
# Mostra opes na tela
#
e ho 1) Opo 1
e ho 2) Opo 2
# L a opo es olhida e guarda na varivel OPCAO
#
read OPCAO
# Caso a opo seja 1 ou 2, imprime a opo es olhida
# pelo usurio. Se no for, avisa que no foi es olhida
# nem uma, nem a outra.
#
ase $OPCAO in
1)
e ho "Vo es olheu 1"
;;
2)
e ho "Vo es olheu 2"
;;
*)
e ho "Vo no es olheu nem 1 nem 2"
exit
;;
esa
Pronto! Agora  ou bem melhor. Quem en ontrar o seu digo daqui a duzentos
anos, perdidos em um monte de papel e amadas de lixo, poder identi ar exatamente o que ele faz. Ou, se vo no quiser esperar duzentos anos, qualquer um
que en ontrar um programa seu perdido em um HD ir onseguir saber o que ele
faz e omo alter-lo. Isso sim bem importante, prin ipalmente se vo estiver
administrando um sistema e sair de frias (ou for despedido, nun a se sabe).

2.3

Passando parmetros para os seus s ripts

Existem duas maneiras de passar alguma informao nos seus s ripts. A primeira
a gente j viu, om o omando read, em que o usurio digita o que quer durante
a exe uo do s ript. A outra maneira, bem mais e iente se quisermos exe utar

CAPTULO 2.

PROGRAMANDO

19

s ripts de manuteno, passar os argumentos diretamente na linha de omando,


por exemplo:
punkra hael:~$ ./meus ript
Os argumentos so:
punkra hael:~$ ./meus ript um dois trs quatro
Os argumentos so: um dois trs quatro
O bash forne e vrias maneiras de dete tarmos em um s ript quais so os argumentos, quantos so e omo enderear ada um deles, o digo do meus ript, est
listado logo abaixo:

#!/bin/sh
e ho Os argumentos so: $
Ou seja, om isso ns j aprendemos que o $ mostra todos os argumentos da
nossa linha de omando. Algumas outras variveis teis podem ser vistas na nova
verso do meus ript.

#!/bin/sh
e ho Vo est exe utando o $0
e ho Foram passados $# argumentos para o s ript
e ho Os argumentos so: $
e ho O primeiro deles o $1
A ho que o s ript em si no pre isa de muitas expli aes, veja o resultado da
exe uo dele:

punkra hael:~$ ./meus ript um dois tres quatro


Vo est exe utando o ./meus ript
Foram passados 4 argumentos para o s ript
Os argumentos so: um dois tres quatro
O primeiro deles o um
A expli ao rpida :

$# - Quantidade de argumentos passados na linha de omando


$ - Lista om os argumentos passados na linha de omando
$0- Comando exe utado
$1, $2, $3, et ... - Primeiro, Segundo, Ter eiro, et ... argumento

CAPTULO 2.

PROGRAMANDO

Podemos agora at fazer um


mentos:

20

s ript que s a eite ser exe utado se houverem argu-

#!/bin/sh
if ! [ "$#" = "0" ; then
e ho Vo est exe utando o $0
e ho Foram passados $# argumentos para o s ript
e ho Os argumentos so: $
e ho O primeiro deles o $1
else
e ho Mmia! Pre isa de um argumento!
fi
Esta a nossa verso nal do meus ript. Agora ele s exe uta se a quantidade
de argumentos for diferente de 0. E, aso no haja nenhum argumento devolve ao
usurio uma mensagem de erro edu ada e expli ativa.

2.4

De novo!

Alm das estruturas de seleo, outras muito importantes para um programa so


as estruturas de iterao. Elas fazem om que um determinado pedao do digo
seja repetido durante uma quantidade x de vezes (onde essa quantidade x pode
ser uma quantidade innita).
O primeiro mtodo a ser utilizado o for. Com ele ns podemos passar por
uma srie de elementos em uma lista. A sintaxe dele :

for variavel in lista; do


omando1
omando2
...
omandoN
done
Onde lista, so vrias opes separadas por espaos, tab s, ou newline s. Para
termos uma idia de omo isso fun iona, podemos fazer o seguinte:

#!/bin/sh
for i in `ls /tmp`; do
e ho En ontrado o arquivo $i
done

CAPTULO 2.

PROGRAMANDO

21

O que isso ir fazer? Primeiramente, ser exe utado o ls /tmp (lembre que vimos
que para passar o resultado de um omando para uma varivel, usamos VARIAVEL=` omando`, neste aso, estamos passando o resultado do omando omo
lista para o for).
Depois de exe utado ls /tmp, ser exe utado o for, sendo que a varivel i
ir assumindo o valor de ada elemento da lista, um por vez. Com isso, podemos
ver que o for do sh no est limitado a utilizar apenas nmeros, podendo usar
qualquer oisa omo ndi e. Bastando para isso olo ar em uma lista os valores
que queremos que i assuma, podemos usar o s ript abaixo omo exemplo:

#!/bin/sh
e ho "Os vertebrados se dividem em:"
for i in Mamferos Aves Reptis Anfbios Peixes; do
e ho -e "\tClasse $i"
done
A sada dele :

punkra hael:~$ ./vertebrados


Os vertebrados se dividem em:
Classe Mamferos
Classe Aves
Classe Reptis
Classe Anfbios
Classe Peixes
Agora vem a grande dvida: e para usar o for ontando um nmero x de vezes?
Isso razoavelmente f il. A primeira opo bem simples:

for i in 1 2 3 4 5 6 7 8 9 10; do
e ho $i
done
Pronto! Isso ir ontar de 1 a 10. O pro edimento realmente simples... ontanto
que sejam pou os os nmeros. Se forem mais, podemos usar omo auxiliar direto
o omando seq. Veja o resultado dele na linha de omando:

punkra hael:~$ seq 1 5


1
2
3
4
5
punkra hael:~$

CAPTULO 2.

PROGRAMANDO

22

O omando seq onta sozinho a quantidade que quisermos, e onta bonitinho.


Forando um pou o a memria, podemos lembrar que um lao for, pode utilizar
uma lista separada por espaos, tab s ou newline s... e a sada do seq se enquadra
no ltimo aso. Vamos fazer o nosso teste om o seguinte digo:

for i in `seq 1 10`; do


e ho $i
done
Podemos ver o que o resultado justamente o esperado, uma seqn ia de nmeros
indo do 1 ao 10. Com isso j sabemos omo fazer para ir do 1 ao 500 ou do 1000
ao 3 (sim! o seq tambm faz seqn ias de res entes).
Ainda existe uma outra alternativa para se fazer laos numri os usando o for
do bash. Para quem tem familiaridade om a linguagem C, isso pode at mesmo
pare er natural, mas ainda a ho a sintaxe tradi ional muito mais intuitiva:

for ((i=1; i<11; i++)); do


e ho $i
done
Isto far om que a ontagem do i se ini ie no 1, v at que o i seja igual ou
maior que 11 e o in remento de um em um. Meio riptogr o para quem no
onhe e (embora quem j onhea talvez a he essa salada mais simples que a idia
da lista).
Outra maneira de fazer uma iterao utilizando o omando while. A sintaxe
dele :

while ondio; do
omando1
omando2
...
omandoN
done
Ou seja, ser exe utado o digo um zilho de vezes, enquanto a tal ondio for
verdadeira. Podemos onstruir om rapidez um exemplo didti o (porm intil)
usando o while. Podemos v-lo logo abaixo:

#!/bin/sh
while ! [ "$A" = "3" ; do
e ho "1) lista arquivos"
e ho "2) lista pro essos"

CAPTULO 2.

PROGRAMANDO

e ho "3) sai"
read OPCAO
ase $OPCAO in
1)
;;
2)
;;
3)

done

esa

;;

23

ls
ps
A=$OPCAO

O que este programa faz? Simples... enquanto A for diferente de 3, ele ir apresentar um menu (os omando e ho esto a para isso...) e, depois, ser lida
uma opo. No aso dela ser 1, sero listados os arquivos do diretrio orrente.
(Talvez o s ript que mais interessante om um | more depois do ls, para deixar
a listagem mais a essvel. Se a opo for 2, mostra os pro essos da shell orrente.
E, no aso da resposta ser 3, muda o valor de A, para 3 o que ir fazer om que o
programa saia do lao while e, om isso, o nosso s ript hegar ao m.
Se quisermos um lao innito, o omando while est entre os mais votados.
Basta que a ondio seja sempre verdadeira... e temos um omando s para isso
-;)

while true; do
e ho Vou en her a tela de lixo! Me pare om CTRL+C
done
O omando true, sempre devolve verdadeiro. Enquanto o omando false sempre
devolve falso. A redite, os dois tem utilidades e algum dia vo vai pre isar de um
deles (alm de usar o true em laos innitos)

2.5

Extra! Extra!

No pensei em nenhum lugar melhor para olo ar essas informaes, e elas so


muito importantes para quem pretende programar seriamente utilizando shell
s ripts. O primeiro dos truques o uso de funes. Existem duas maneiras de
se de larar uma funo:

CAPTULO 2.

PROGRAMANDO

24

fun tion nome_da_fun ao {


omando1
omando2
...
omandoN
}
Ou

nome_da_fun ao() {
omando1
omando2
...
omandoN
}
Os dois mtodos so equivalentes. apenas uma questo de gosto preferir um
ou o outro. sempre bom lembrar que as funes devem estar todas de laradas
antes de serem hamadas. Ou seja, normalmente olo amos elas no omeo do
programa. Podemos ver a de larao e o uso de funes no nosso exemplo:

#!/bin/sh
fun tion fun ao1 {
e ho Vo hamou a funo 1 om o argumento $1
e ho E o seu login $USER
}
fun ao2() {
e ho Vo hamou a funo 2 om o argumento $1
e ho E o seu home $HOME
}
fun ao1 argumento1
read -n1 -p "Qualquer te la para ontinuar"
fun ao2 argumento2
Temos a duas funes, ada uma de larada de uma maneira. Ateno para o
mtodo omo so passados os argumentos para a funo. Eles so endereados da
mesma maneira que para um novo s ript, o primeiro argumento $1, o segundo
$2, o ter eiro $3 e por a vai... Este foi o nosso tutorial ultra-rpido de omo
utilizar funes.
O segundo omando que julgo muito importante passar, o trap. Ele onsegue
apturar alguns dos sinais para matar o seu programa. E qual a utilidade disso?

CAPTULO 2.

PROGRAMANDO

25

Uma delas fazer om que o seu programa no saia om um simples CTRL+C, a


outra, fazer om que ele saia, mas antes disso oloque a asa em ordem.
Normalmente, a medida que um programa vai sendo exe utado ele vai riando
arquivos temporrios, arquivos de lo k, arquivos de trabalho, diretrios estranhos,
et ... e no se pode deixar todo esse monte de tralhas entupindo o sistema. Alguma
hora a asa ai. Por isso omum utilizarmos o omando trap em onjunto om
uma funo para a limpeza do sistema. Algo do tipo:

leanup() {
rm -rf /tmp/arquivo.tmp /tmp/arquivo2.tmp
}
trap ' leanup' 2 15
Isso ir fazer om que o seu s ript inter epte os sinais 2 e 15 (SIGINT e SIGTERM).
Quando um destes dois sinais hegar, ser exe utada a funo leanup que vai
limpar as sujeiras que o seu s ript deixa no sistema. Fe hamos o aptulo om
have de ouro -:) No sempre que onseguimos um exemplo didti o e til ao
mesmo tempo -:)

Captulo 3
Trabalhando om Textos
Um dos prin ipais usos de um shell s ript no trabalho om textos. Desde os
primrdios do UNIX, foram riadas vrias ferramentas para manipulao de textos
e strings e essas ferramentas foram algumas das responsveis pela disseminao
do sistema opera ional. Como ns j dissemos anteriormente, a losoa *NIX a
de diversos pequenos utilitrios, ada um realizando bem uma tarefa, trabalhando
unidos, para atingir o melhor resultado.
Neste aptulo faremos um uso intensivo destes pequenos utilitrios e de pipes,
para passar a sada de um destes omandos para outro. Como j omum, no
iremos esgotar ada omando, mostrando todas as opes, iremos apenas dar
uma apresentao e suas prin ipais opes.

3.1

Sele ionando textos

Conseguir lo alizar os textos que nos interessam no meio de dezenas de arquivos


algo importante. Para isso existe o omando grep, om ele possvel pro urar
um determinado padro em um arquivo, ou na sada de um omando (passada via
pipe ). Por exemplo:

punkra hael:~$ free


total
Mem:
256148
-/+ buffers/ a he:
Swap:
265032

used
237784
81736
72

free
18364
174412
264960

shared
0

buffers
19200

O omando free mostra a quantidade de memria utilizada pelo sistema, om


vrios detalhes. Agora, vamos supor que quisssemos ver apenas a linha em que
mostrado o uso da memria swap, omo fazer? O omando grep resolve o
problema:
26

a hed
136848

CAPTULO 3.

TRABALHANDO COM TEXTOS

punkra hael:~$ free | grep Swap


Swap:
265032
72

27

264960

Pronto! Conseguimos mostrar om fa ilidade apenas a linha que nos interessa! E


quando pro uramos uma determinada informao em vrios arquivos, omo fazer?

punkra hael:/et $ grep -r "192.168.0.2" * 2>/dev/null


hosts:192.168.0.2
ra hael.mylab ra hael
r .d/r .inet1. onf:IPADDR[0="192.168.0.2"
resolv. onf:nameserver 192.168.0.2
O omando utilizado a ima mostra bem omo fazer -;). A opo -r que est no
grep serve para que o omando fun ione de modo re ursivo, ou seja, pro ure no
diretrio lo al e em seus subdiretrios. O 192.168.0.2 que est entre aspas
o padro que estamos pro urando ( o IP da minha mquina), o * serve omo
oringa, e indi a todos os arquivos e, por m o 2>/dev/null redire iona todos os
erros para o vazio.
A sada do omando mostra exatamente quais arquivos ontm o padro sele ionado e o ontedo do arquivo nesta determinada linha. Assim, se temos uma
idia do que estamos pro urando, podemos editar diretamente o arquivo orreto.
Ou, se no temos uma idia, podemos ter alguma di a de onde melhor pro urar
-;)
Tambm possvel fazer onstrues omplexas om o omando grep e o auxlio
de algumas expresses regulares. Estas tais expresses regulares so alguns onjuntos de ara teres espe iais que fa ilitam o trabalho de en ontrar padres. Alguns
exemplos de expresso regular:

[0-9 - Qualquer um dos nmeros de 0 a 9 (0,1,2,3,4,5,6,7,8,9). De maneira


anloga temos [a-z e [A-Z, que mostram o onjunto dos ara teres de a
a z e de A a Z.
[FdGl - O padro neste aso F mais ulo, o d mins ulo, o G mais ulo
e o l mins ulo novamente. Podemos ombinar este tipo de padro om
o anterior: [a-fl-z, asaria om qualquer letra de a a f e de l a z (mas
deixaria de fora o g, h, i, j, k).
[^g-k - Qualquer ara ter que N O seja g, h, i, j e k. Quando o ^ apare e
dentro de [, ele fun iona omo sendo uma negao.
^root - Outro uso para o ^, mas totalmente diferente: fora dos [, o ^
representa o in io de uma linha e, neste aso, estaramos pro urando uma
linha que omeasse om a palavra root.

CAPTULO 3.

28

TRABALHANDO COM TEXTOS

root$ - O $ representa o nal de uma linha. Ou seja, o nosso padro neste


aso uma linha que terminasse om a palavra root.
.* - Qualquer oisa. Literalmente. Se quisermos por exemplo pro urar
algo que tenha lala e lele e algo (que no sabemos o que) entre essas duas
palavras, podemos usar a expresso: lala.*lele. Se utilizarmos o . sozinho
(sem o *) iremos asar qualquer ara ter (mas apenas UM ara ter).
Estes exemplos no obrem nem 10% do que as expresses regulares so apazes
de fazer, mas so su ientes para muitos usos. Vamos dar uma olhada no uso de
expresses regulares utilizando um novo exemplo: quando o espao em dis o de
uma mquina a aba, ou  a es asso, um monte de pequenos (e grandes) problemas
podem a onte er. Para que isso seja evitado, ne essrio que seja veri ado
onstantemente a quantidade de dis o utilizada e isso pode ser feito om o omando
df.
Normalmente, s queremos ser avisados quando a o upao do dis o ultrapassa
um determinado valor (digamos que uma o upao igual ou maior a 70%, o que
um bom exemplo (embora na vida real seja mais interessante monitorar a partir
dos 90%)):

punkra hael:~$ df | grep "[7-9[0-9%"


/dev/hda6
2038472 1474756
/dev/hda7
2038472 1569020

458492 77% /usr


364228 82% /opt

Pronto! Mostramos as duas parties que esto om mais de 70% de o upao.


Preste bastante ateno no padro utilizado, pensamos em um primeiro ara ter
obrindo os algarismos de 7 a 9 e um segundo ara ter obrindo de 0 a 9, isso
obre todos os nmeros de 70-99. O que deixou um bura o na nossa linha de
omando... e se a partio estiver 100% o upada? Neste aso temos que usar mais
alguns re ursos de expresses regulares:

punkra hael:~$ df | grep "\(100\|[7-9[0-9\)%"


/dev/hda6
2038472 1474756
458492 77% /usr
/dev/hda7
2038472 1569020
364228 82% /opt
Agora est OK, obrimos os valores de 70 a 99 e o 100 om apenas uma expresso
regular... mas o que quer dizer esta barbaridade?

() - Os parntesis separam grupos distintos


| - serve omo sendo um OU para sele ionar entre uma expresso (ou grupo
de ara teres) e outro.

CAPTULO 3.

TRABALHANDO COM TEXTOS

29

A nossa expresso : (100|[7-9[0-9)%, ou seja o nmero 100 ou algo entre 70 e


99 e, em seguinda o smbolo de por entagem. O que exatamente o que queremos
100% ou 70 a 99%. Os \ so um pequeno detalhe, pequeno e desagradvel.
Apesar das expresses regulares em si serem razoavelmente padronizadas, alguns
omandos j utilizavam os smbolos para outra oisa ou (s vezes) o prprio shell
tem algum outro uso para os omandos indi ados. Da vem o uso dos \, para fazer
om que alguns ara teres sejam interpretados da maneira orreta. O lado ruim,
que ada omando utiliza os \ para ara teres diferentes, assim, o que pre isa de
um \ no grep, pode no pre isar no sed ou no awk e vi e-versa. O jeito de orar
ou apelar para a tentativa e erro.
Um ltimo retoque na nossa expresso: uma mquina pode ter sistemas de
arquivos lo ais e remotos, e os sistemas de arquivos remotos geralmente so geren iados pela mquina remota (e mesmo que no fossem, quem tem que uidar disso
o administrador da outra mquina e no vo ), os sistemas de arquivo lo ais
omeam om aquele /dev, vamos garantir que outros sistemas de arquivo no
atrapalhem a nossa pobre vida:

punkra hael:~$ df | grep '^/dev.*\(100\|[7-9[0-9\)%'


/dev/hda6
2038472 1474756
458492 77% /usr
/dev/hda7
2038472 1569020
364228 82% /opt
In lumos o ^/dev.* que engloba toda linha que omear om /dev e for seguida
de zero ou mais ara teres (quaisquer ara teres, em qualquer quantidade). Fi ou
bom, no a ham?
Outro passo importante de se sele ionar um texto onseguir apturar apenas
o que for interessante no texto, o que s vezes no toda a sada forne ida pelo
grep. Por exemplo, naquele omando que demos para lo alizar em quais arquivos
havia a string 192.168.0.2. A sada era a seguinte:

punkra hael:/et $ grep -r "192.168.0.2" * 2>/dev/null


hosts:192.168.0.2
ra hael.mylab ra hael
r .d/r .inet1. onf:IPADDR[0="192.168.0.2"
resolv. onf:nameserver 192.168.0.2
Mas, a informao que queramos era em quais arquivos existem essa string. Na
sada do grep, os arquivos so o pedao anterior aos :, e isso que queremos. Para
ter a esso a esta informao, vamos utilizar o omando ut:

punkra hael:/et $ grep -r "192.168.0.2" * 2>/dev/null | \


ut -f1 -d:
hosts
r .d/r .inet1. onf
resolv. onf

CAPTULO 3.

TRABALHANDO COM TEXTOS

30

A sintaxe do ut extremamente simples:

ut -f ampo -ddelimitador
No nosso aso, queremos o primeiro ampo (-f1) separados por : (-d:). Para
ontinuar o nosso treinamento, algo um pou o mais ompli ado, vamos tentar
sele ionar, na sada do omando if onfig, o IP da nossa mquina:
punkra hael:~$ /sbin/if onfig eth0
eth0
Link en ap:Ethernet HWaddr 00:50:BF:67:88:97
inet addr:192.168.0.2 B ast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metri :1
RX pa kets:141120 errors:0 dropped:0 overruns:0 frame:0
TX pa kets:243521 errors:0 dropped:0 overruns:0 arrier:0
ollisions:4479 txqueuelen:100
RX bytes:15819409 (15.0 Mb) TX bytes:84671582 (80.7 Mb)
Interrupt:10 Base address:0xa000

O primeiro passo, sele ionar a linha em que se en ontra o IP, podemos aptur-la
utilizando omo padro o inet addr:
punkra hael:~$ /sbin/if onfig eth0 | grep "inet addr"
inet addr:192.168.0.2 B ast:192.168.0.255 Mask:255.255.255.0

Depois disso, o nosso prximo passo sele ionar a parte do omando que ontm
o IP. Para isso, vamos separar o segundo ampo delimitado por :.

punkra hael:~$ /sbin/if onfig eth0 | grep "inet addr" | \


ut -f2 -d:
192.168.0.2 B ast
E, nosso ltimo passo, separar o primeiro ampo, delimitado por um espao em
bran o:

punkra hael:~$ /sbin/if onfig eth0 | grep "inet addr" | \


ut -f2 -d: | ut -f1 -d' '
192.168.0.2
Pronto! J temos o nosso IP (e agora vo s j sabem omo fazer para sele ionar
apenas o IP da sua mquina dentro de um s ript), mais um exemplo de exemplo
til!

CAPTULO 3.

3.2

31

TRABALHANDO COM TEXTOS

Organizando

J onseguimos sele ionar exatamente o que queremos na sada de um omando


(ou diretamente de um arquivo: no aso do grep, ele a eita o nome do arquivo
na prpria linha de omando e, mesmo que no a eitasse, poderamos passar o
ontedo do arquivo utilizando o omando at). Mas, podemos pre isar de uma
pequena ajuda para olo ar as oisas em ordem.
O omando ps, serve para mostrar quais os pro essos esto sendo exe utados
pelo sistema. Alm do nome dos pro essos em si, ele apresenta vrias outras
informaes:

punkra hael:~$
punk
924
punk
1110
punk
1196
punk
1350

ps -edf
923 0
1109 0
1195 0
1349 0

| grep bash
17:22 pts/1
17:42 pts/2
18:11 pts/0
18:28 pts/3

00:00:00
00:00:00
00:00:00
00:00:00

-bash
-bash
-bash
-bash

Na primeira oluna temos o usurio dono do pro esso, depois do PID dele ( um
nmero que identi a o pro esso no sistema), depois o PPID (Parent PID, que o
PID do pro esso pai deste pro esso), o uso da CPU, a hora em que foi ini iado
e outras informaes, nalizando om o nome do pro esso.
Podemos utilizar ps -edo user, para mostrar apenas a oluna om o nome
do usurio, de todos os pro essos exe utados na mquina... porm, a sada desse
omando enorme:

punkra hael:~$ ps -edo user | w -l


76
O w -l serve para ontar a quantidade de linhas que tem um arquivo (e, no nosso
aso, a sada do ps), a sada  a deste tamanho porque normalmente, esto sendo
exe utados dezenas de pro essos em uma mquina. E pior, um ni o usurio pode
ser responsvel por algumas dezenas destes pro essos...
Mas, omo foi dito, o omando ps -edo user mostra apenas a lista om o
nome do usurio responsvel por ada pro esso, ou seja, no nal das ontas queremos apenas uma lista om o nome dos usurios, sem repeties. Para ns no
est interessando quantos pro essos um determinado usurio est exe utando, nos
interessa se o usurio est ou no exe utando um pro esso e, se estiver, queremos
o nome dele.
Podemos diminuir muito esse problema om o uso do omando uniq, ele elimina
as linhas repetidas de uma sada, podemos ento usar:

CAPTULO 3.

TRABALHANDO COM TEXTOS

32

punkra hael:~$ ps -edo user | uniq


USER
root
rp
root
lp
root
daemon
root
punk
root
punk
root
marina
punk
Infelizmente, nossa idia no deu erto -:(, apare em ainda vrias vezes o nome
de alguns usurios. A ausa deste nosso pequeno problema a ordem om que os
pro essos so listados, em ordem de  hegada, vejamos a diferena:

punkra hael:~$ at teste


lala
lala
lele
lala
punkra hael:~$ uniq teste
lala
lele
lala
O ontedo do arquivo teste, so as palavras lala, lala, lele e lala, ada
uma em uma linha. Quando usamos o omando uniq, ele apenas elimina onde as
linhas idnti as que esto em seqn ia. E isto que o orre om o a sada do nosso
ps -edo user. Mas, para tudo existe soluo, e podemos utilizar o omando sort
para olo ar uma sada de maneira ordenada, vejamos:

punkra hael:~$ sort teste


lala
lala
lala
lele

CAPTULO 3.

TRABALHANDO COM TEXTOS

33

Agora o arquivo est ordenado, e pronto para eliminarmos as linhas repetidas om


o uniq.

punkra hael:~$ sort teste | uniq


lala
lele
E a hamos a soluo para o nosso problema!!! Vamos agora apli -la nossa lista
de usurios:

punkra hael:~$ ps -edo user | sort | uniq


daemon
lp
marina
punk
root
rp
USER
O ltimo retoque ser eliminar onde est es rito USER (que na realidade apenas
o abealho do omando ps) om um grep reverso:

punkra hael:~$ ps -edo user | sort | uniq | grep -v USER


daemon
lp
marina
punk
root
rp
Este um bom exemplo para mostrar o quanto os pipes so teis, passamos a
sada do omando ps por outros trs omandos, ada um exer endo uma funo
diferente e auxiliando o omando anterior para nos dar o resultado desejado.
Outra grande ferramenta para a manipulao e formatao de textos o awk.
Alis, hamar o awk apenas de ferramenta menosprezar os seus poderes... na
realidade, o awk uma linguagem de programao ompleta, om diversas apa idades. Basi amente, o que a sintaxe do awk :

awk '/padrao/ { ao }' arquivo


Se no for listada nenhuma ao, o awk ir apenas imprimir as linhas que asarem
om o padro. Vamos ao nosso primeiro exemplo:

CAPTULO 3.

TRABALHANDO COM TEXTOS

34

punkra hael:~$ free | awk '/Swap/'


Swap:
265032
72
264960
Neste primeiro aso, utilizamos o awk omo se fosse o omando grep. Ele apenas
imprimiu a linha que asou om o padro dado. Da mesma maneira que om o
grep, podemos utilizar expresses regulares omo padro a ser en ontrado:

punkra hael:~$ df | awk '/\/dev.*(100|[7-9[0-9)%/'


/dev/hda6 2038472 1474756 458492 77% /usr
/dev/hda7 2038472 1569020 364228 82% /opt
Com a vantagem que diminumos muito o uso do \ (lembra quando eu falei que
ada omando pre isava do \ em lo ais diferentes?). Uma grande vantagem do
awk em relao ao grep a existn ia do ampo ao, om ele podemos fazer o
awk realizar oisas diferentes para ada tipo de padro en ontrado:

punkra hael:~$ df | awk '


> /^\/dev.*(100|[7-9[0-9)%/
> print "A partio "$1" est
> }'
A partio /dev/hda6 est om
A partio /dev/hda7 est om

{
om "$5" de o upao"
77% de o upao
82% de o upao

Neste nosso novo omando, quando en ontramos o padro desejado, imprimimos


uma mensagem espe ial, o $1 e o $5 se referem ampos separados por espaos
ou tabulaes. Juntamos o grep e o ut em um s omando -:) Podemos usar o
awk omo sendo o ut, veja:

punkra hael:/et $ grep -r "192.168.0.2" * 2>/dev/null | \


awk -F: '{ print $1 }'
hosts
r .d/r .inet1. onf
resolv. onf
O -F: dene o delimitador a ser utilizado, omo o -d do omando ut. Para falar
a verdade, possvel umprir as funes de muitos outros omandos om o awk
e, in lusive, riar novos. Vamos riar o nosso s ript mem, em seu editor favorito
es reva:

#!/bin/sh
free | awk '
BEGIN {

CAPTULO 3.

}
/Mem:/ {
}
/-\/+/ {
}'

35

TRABALHANDO COM TEXTOS

print "Memria"
print "\tTotal: "$2"\tBuffers: "$6"\tCa heada: "$7
print "\tUsada: "$3"\tLivre: "$4

O que faz este nosso programa? Ele pega a sada do omando free e a transforma
em algo um pou o mais inteligvel, torne-o exe utvel e veja o que a onte e quando
hamado:

punkra hael:~$ mem


Memria
Total: 256148
Usada: 91136

Buffers: 22596
Livre: 165012

Ca heada: 134012

Com isso a aba a famosa onfuso em que o indivduo a ha que o Linux est
usando toda a memria dele, ulpa dos ampos used e free que apare em na
sada do omando free. No aso do nosso awk a ni a novidade o BEGIN, na
realidade ele um tipo de padro espe ial que exe utado no in io do programa.
Outro padro semelhante o END, que sempre exe utado aps todas as linhas
haverem sido pro essadas.

3.3

Editando

Alm de a har uma informao e format-la da maneira que a har mais agradvel,
uma ne essidade razovel alterar o ontedo de um arquivo. Vamos tomar omo
exemplo o /et /hosts que lista alguns IPs e nomes (normalmente os ni os IPs
ali so o do lo alhost e o da sua mquina, os outros ostumam estar sob responsabilidade de um DNS):

punkra hael:~$ at /et /hosts | grep -v "^#\|^$"


127.0.0.1
lo alhost
192.168.0.2
ra hael.mylab ra hael
O grep ali faz om que todas as linhas de omentrio (^#) e todas as linhas vazias
(^$) no sejam mostradas, sendo mostrado apenas o que nos interessa. Pode
ser ne essrio alterar o IP da nossa mquina, e isso iremos fazer om auxlio do
omando sed:

CAPTULO 3.

TRABALHANDO COM TEXTOS

36

punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \


> sed -e "s/192.168.0.2/192.168.0.100/"
127.0.0.1
lo alhost
192.168.0.100
ra hael.mylab ra hael
Vejam que onde estava 192.168.0.2 foi tro ado para 192.168.0.100. Isso feito
pelo argumento entre aspas do sed.
s/192.168.0.2/192.168.0.100/ quer dizer: substitua onde est 192.168.0.2
por 192.168.0.100. Poderamos fazer isso om o nome do omputador tambm
(onde est ra hael):

punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \


> sed -e "s/ra hael/pris/"
127.0.0.1
lo alhost
192.168.0.2
pris.mylab ra hael
Oh! oh! Algo deu errado! Ele tro ou apenas o primeiro ra hael da linha, deixou o
segundo l, into ado. Mas assim que o sed fun iona, o padro tro ar apenas a
primeira o orrn ia dentro de uma linha e depois pro urar outra linha. Para mudar
isso, pre isamos indi ar o que deve alterar todas as o orrn ias que en ontrar, isso
feito olo ando um g no nal do padro:

punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \


> sed -e "s/ra hael/pris/g"
127.0.0.1
lo alhost
192.168.0.2
pris.mylab pris
Pronto! Agora tudo est orreto, mudamos o nome da nossa mquina para pris
(para quem no sabe, pris e ra hael so Repli antes do lme Blade Runner ).
Podemos agora mudar o nome e o IP ao mesmo tempo:

punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \


sed -e "s/ra hael/pris/g" -e "s/192.168.0.2/192.168.0.100/"
127.0.0.1
lo alhost
192.168.0.100
pris.mylab pris
Vamos aproveitar e aprender mais uma sobre o sed, faa:

punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \


sed -e "s/ra hael/pris/g" -e "s/192.168.0.2/192.168.0.100/" \
-e "/127.0.0.1/d"
192.168.0.100
pris.mylab pris

CAPTULO 3.

TRABALHANDO COM TEXTOS

37

Vemos que a nossa ltima adio apagou (ou deletou) a linha que ontinha o
127.0.0.1. Com isso j temos omo tro ar palavras e apagar linhas. A ltima oisa
que nos falta es rever isso no nosso arquivo de destino:

punkra hael:~$ at /et /hosts | grep -v "^#\|^$" | \


sed -e "s/ra hael/pris/g" -e "s/192.168.0.2/192.168.0.100/" \
-e "/127.0.0.1/d" > ~/hosts.new
Pronto! Tudo foi dire ionado para o nosso novo arquivo hosts.new dentro do
$HOME do usurio. Colo amos dentro do HOME do usurio apenas porque no
podemos es rever no /et /hosts original, que s pode ser sobres rito pelo usurio
root.
Aqui vai um toque espe ial, NUNCA (eu disse NUNCA) use o mesmo arquivo omo sendo arquivo de entrada e de sada de um omando. Veja o que pode
a onte er:

punkra hael:~$ at teste


lala
lele
lolo
punkra hael:~$ sed -e "s/lolo/lili/" teste > teste
punkra hael:~$ at teste
punkra hael:~$
O arquivo teste foi apagado. Existe uma maneira de burlar este problema:

punkra hael:~$ at teste2


fafa
fefe
fofo
punkra hael:~$ at teste2 | sed -e "s/fofo/fifi/" > teste2
punkra hael:~$ at teste2
fafa
fefe
fifi
Com este nosso omando, primeiro o arquivo teste2 lido e, apenas depois do
arquivo lido passado para o omando sed e este es reve no prprio arquivo
original. Mas, mesmo assim esta no uma boa idia, o melhor pro esso para se
editar um arquivo o seguinte:

punkra hael:~$ mv teste2 teste2.bak


punkra hael:~$ at teste2.bak | sed -e "s/fafa/fofo/" > teste2
Com isso ns mantemos o arquivo original, e no orremos o ris o de ausar nenhum
dano a ele. Anal, sempre bom manter algum ba kup, no ?

Captulo 4
Aparn ia Tudo...
Depois de toda a nossa lgi a feita, temos que arranjar uma maneira de falar om
o usurio, para que tudo no que um puro e perfeito aos e o usurio faa o que
ele mais gosta de fazer: burri es, s vezes danosas. Para isso existem vrias idias
e maneiras diferentes de deixar os s ripts visualmente mais agradveis, sendo que
elas no so ompartimentos estanques, sempre podem ser mes ladas umas om
as outras em bus a de uma fun ionalidade melhor...

4.1

O mtodo COBOL

um mtodo trabalhoso, mas tem algumas vantagens:


1. extremamente legvel
2. vo sabe *exatamente* o que vai apare er na tela
3. fun ionou durante mil anos, porque deixaria de fun ionar agora?
O mtodo onsiste em desenhar todas as telas do programa e imprimi-las na tela
onforme desenhadas, no momento ne essrio. Isso feito om o omando at.
Alguns usurios mais avanados desta t ni a, olo am as telas em arquivos texto,
e vo olo ando estes arquivos na tela na hora orreta, ou ento olo am todas as
telas em um grande arquivo e atravs de greps bem es olhidos e outra funes
ar anas vo mostrando-as a medida que o usurio es olhe as suas opes.
Uma grande desvantagem, alm do trabalho hato, que as telas  am forosamente om o tamanho om que as riamos, isso no era problema quanto todos
usvamos terminais om 80x25 ara teres, mas hoje em dia, po a de interfa es
gr as, xterms, rxvts e onde at mesmo os terminais texto ederam aos en antos do framebuer, orremos o ris o de ter uma telinha ridi ulamente pequena no
38

CAPTULO 4.

APARNCIA TUDO...

39

anto superior esquerdo da tela e um gigantes o espao em bran o (ou, na maioria


das vezes, em negro)
Para ilustrar este mtodo, zemos um pequeno s ript om apenas um tre ho
da tela, podemos v-lo na seqn ia:

#!/bin/sh at < <EOF


=============================================
|
|
|
Demonstrao Man do Mtodo COBOL
|
|
|
|
Montamos a tela inteira e depois
|
|
imprimimos om um at
|
|
|
=============================================
EOF
E, o efeito do s ript depois de exe utado este:

punkra hael:~$ ./teste


=============================================
|
|
|
Demonstrao Man do Mtodo COBOL
|
|
|
|
Montamos a tela inteira e depois
|
|
imprimimos om um at
|
|
|
=============================================
Idnti o ao desenhado. O que serve omo uma prova da e in ia deste mtodo.

4.2

O mtodo riptogr o

Enquanto o mtodo COBOL requer muita fora bruta e extremamente legvel,


este mtodo requer menos fora bruta, mas a sua leitura est alm da apa idade
dos mortais. O texto todo impresso atravs de ara teres de ontrole:

punkra hael:~$ e ho -e "\n\t\tMenu de Opes\n\n\t\t\


1)Opo 1\n\n\t\t2)Opo 2\n\n\t\t3)Sair\n\n\tEs olha \
a opo desejada: \ " ; read -n1 OPCAO

CAPTULO 4.

APARNCIA TUDO...

40

A linha anterior um bom exemplo desta t ni a. O -e do e ho, faz om que os


digos de ontrole sejam exe utados. O \n faz um salto para o in io da prxima
linha, e o \t uma tabulao. Enquanto o \ avisa para que o e ho no salte
uma linha. Para se ter uma idia do qu a onte e, o resultado este:

Menu de Opes
1)Opo 1
2)Opo 2
3)Sair
Es olha a opo desejada:
Apesar de um programa inteiro utilizando estes ara teres  ar bem enfadonho (e
eles terem a mesma limitao das telas desenhadas em nossa era de terminais om
dimenses variveis), este mtodo muito onveniente para algumas mensagens
de progresso, ou para se es rever logs om uma formatao agradvel. O s ript
abaixo mostra um uso deste mtodo (desta vez, para saber o resultado, vai ter que
es rever e rodar o s ript ):

#!/bin/sh
if [ "$#" = "0" ; then
e ho -e "\nPor favor, utilize:\n\n\t# $0 <arquivo>\n"
else
e ho -e "\nPro urando por $1\t\t\ "
ACHEI=`find ./ -name "$1" 2>/dev/null`
if [ "$ACHEI" != "" ; then
e ho -e "Lo alizado $ACHEI"
else
e ho -e "\tFALHOU"
fi
e ho
fi
Atravs dos digos podemos tambm es rever textos oloridos, j que existem
digos de ontrole espe iais para olo armos um pou o de or em nossos s ripts.
Mensagens de erro em vermelho ostumam  ar bem hamativas.
A sintaxe para isso no to ompli ada quanto pare e primeira vista:

punkra hael:~/s ripts$ e ho -e "\033[37;44;1mBran o no \


fundo azul\033[0m"

CAPTULO 4.

APARNCIA TUDO...

41

O \033[ o digo da te la ESC, depois vm outros atributos, os que vo do 30 ao


37 se referem or de frente, os do 40 ao 47 se referem or de fundo e o 1m e 0m,
se referem or em modo bold (negrito) ou normal. No Bash-Prompt-HOWTO
tem um programa mostrando os digos e suas respe tivas ores. E vrias outras
maneiras de se usar ara teres de ontrole.

4.3

O bom e velho linha e oluna

Uma abordagem bem tradi ional, e bem exvel. Podemos simplesmente posi ionar o ursor onde quisermos na tela, basta indi ar qual a linha e a oluna em
que ele deve estar. A partir dali, omeamos a es rever.
Por exemplo:

punkra hael:~$ lear; tput up 10 40; e ho "oi"


Ir es rever oi aproximadamente no entro da tela. E logo em seguida apare e
o prompt, Mas podemos melhorar um pou o isso, temos omo saber exatamente
quantas linhas tem a tela:

punkra hael:~$ tput lines


24
De modo anlogo, temos omo saber a quantidade de olunas om o tput ols.
Voltando ao nosso maravilhoso texto oi e ao prompt que insiste a apare er no
meio da tela... Basta depois de es revermos o oi, mandarmos o ursor para o
nal da tela:

punkra hael:~$ lear; tput up 10 40; e ho "oi"; tput up 24 0


E pronto! Agora temos o nosso oi solitrio no meio da tela e o prompt l em
baixo. Mas essas funes de saber a quantidade de linhas e olunas podem ter
outra importn ia, atravs delas possvel dimensionar as nossas telas para o
tamanho de tela do terminal de nossos usurios, e dar uma aparn ia bem mais
interessante, abusando de entralizaes e menus propor ionais...

entraliza() {
TAM=`expr length "$1"`
COLS=`tput ols`
COLUNA=$(((COLS-TAM)/2))
LINHA=$2
tput up $LINHA $COLUNA
e ho $1
}

CAPTULO 4.

APARNCIA TUDO...

42

A funo a ima re ebe a string ($1) e a linha em que ela deve apare er ($2). A
parte da entralizao feita automati amente.

4.4

O menu de bolso

Se o que vo quer um menu rpido, e no est se importando tanto assim para


as aparn ias, o bash j tem uma funo feita sob medida, eu hamo-a de menu
de bolso, de to simples que utiliz-lo, basta saber quais sero as opes e o que
ada uma delas faz:

#!/bin/sh
sele t op ao in "Opo 1" "Opo 2" "Sair"; do
ase $REPLY in
1)
e ho "Vo es olheu 1"
;;
2)
e ho "Vo es olheu 2"
;;
3)
e ho "Saindo"
exit
;;
esa
done
O sele t monta um menu numerado om a lista que houver logo aps o in.
E j deixa um prompt aguardando a entrada dos dados. O dado sendo vlido
(ou invlido), o menu ser reapresentado ao usurio (eliminando a ne essidade de
fazer um loop innito). A resposta do usurio armazenada na varivel REPLY, e
pode ser fa ilmente tratada em um ase, omo vimos a ima. rpido, prti o e
e iente.

4.5

Usando Dialog

O dialog um programa simples de usar que ofere e a vo vrios re ursos "gr os" para in rementar os seus shell s ripts, de uma maneira um pou o mais
automatizada que as vistas anteriormente. Iremos agora "mostrar" um pou o do
dialog, mas ele no se resume apenas ao ontedo deste aptulo, uma boa olhada
no manual dele pode trazer grandes (e agradveis) surpresas.

CAPTULO 4.

APARNCIA TUDO...

43

A estrutura de um omando no dialog bem simples, mas por trs desta


simpli idade est um ser extremamente mal... podemos olo ar tantas opes em
um texto do dialog que fa ilmente um omando ultrapassa 5 ou 6 linhas (e da
para mais). Um exemplo dos mais simples est logo abaixo:

dialog --tipo-de- aixa "Texto da aixa" <tamanho>


Dependendo do tipo-de- aixa, so ne essrias vrias outras opes. Vamos omear
om uma simples, vamos brin ar om uma --msgbox, onde vo pode olo ar informaes do seu programa antes de exe ut-lo...

dialog --msgbox "\


Este um programa muito bem feito \
e espe ial, e depois de li ar em \
OK vo entrar no maravilhoso mundo \
do meu programa wonder-ultra-plus" 0 0
Ir apare er uma aixa entralizada ontendo o texto que vo digitou e um boto
de OK, uma splash s reen bem prossional, no a ham? O "0 0" do m diz que a
janela ser autodimensioanda, mas vo pode for-la a ter o tamanho que quiser
tro ando estes dois nmeros: o primeiro a altura e o segundo a largura da aixa.
Podemos agora melhorar um pou o mais a aparn ia da nossa aixa de mensagens, olo ando um ttulo nela:

dialog --title "Apresentao" --msgbox "\


Este um programa muito bem feito \
e espe ial, e depois de li ar em \
OK vo entrar no maravilhoso mundo \
do meu programa wonder-ultra-plus" 0 0
J  ou melhor no ? Mas para  ar om um visual ainda mais prossional vamos
olo ar um ttulo no fundo, om o nome do nosso programa:

dialog --ba ktitle "MeuPrograma 0.1" --title "Apresentao" ...


Onde esto os ... para olo ar o resto do texto dos exemplos anteriores. Ah!
Estas opes --ba ktitle e --title fun ionam em todas as outras aixas do
dialog. E iremos ver vrias delas...
Continuando em ordem de omplexidade, temos a aixa --yesno onde vo
olo a uma mensagem e o usurio responde esta mensagem om um "sim" ou um
"no". Experimente:

CAPTULO 4.

APARNCIA TUDO...

44

dialog --yesno "Vo deseja apagar tudo?" 0 0


Neste aso surge um novo problema... omo saber o que o seu usurio respondeu?
No aso do --yesno, ele devolve "0" para sim (su esso) e "1" para no (fra asso),
omo a maior parte dos omandos do bash. Um programinha om a pergunta e a
apa idade de re eber a resposta seria semelhante a este:

dialog --yesno "Vo deseja apagar tudo?" 0 0


if [ $? = 0 ; then
dialog --infobox "Apagando tudo..." 0 0
else
dialog --infobox "A vida ontinua..." 0 0
fi
Com isso aprendemos a pegar os resultados do --yesno e de quebra aprendemos
a usar uma --infobox -;)
Depois de duas opes, que tal tentar om mais? A aixa --menu serve para
isso, ela vai apresentar um menu (!!!). um pou o mais ompli ada que os outras
que vimos at agora, tendo muito mais parmetros:

dialog --menu "Sele ione uma opo do menu" 0 0 3 \


1 "Opo 1" \
2 "Opo 2" \
3 "Opo 3"
A primeira alterao visvel, que a parte do tamanho possui 3 argumentos ao
invs de dois, os dois primeiros so os j onhe idos altura e largura, e o ltimo
o tamanho da "lista" de opes.
Se vo olo ar o tamanho da janela da lista menor que a quantidade de opes
existentes, vo poder "rolar" pelas opes (ir apare er um indi ador "v(+)" ou
"^(+)" indi ando que existem mais opes abaixo ou a ima).
Outra alterao bem visvel so as prprias opes! Vo pode olo ar um
"atalho" e depois o texto da opo (E foi assim que zemos, o atalho o nmero
e o texto est entre aspas). Para pegar a sada do "OK" e do "Can el", use o
mesmo pro esso que utilizamos para pegar a sada do --yesno, "0" para OK e "1"
para "Can el". O mais ompli ado pegar a opo sele ionada, para fazer isso
pre isamos:

usar um arquivo temporrio om a opo e depois ler do arquivo o que o


usurio es olheu ou;
Passar a sada diretamente para uma varivel.

CAPTULO 4.

APARNCIA TUDO...

45

Para usar o primeiro dos mtodos, bem simples... apenas oloque no nal do
omando dialog um 2>/tmp/arquivotemporario, omo podemos ver abaixo:

dialog --menu "Sele ione uma opo do menu" 0 0 3 \


1 "Opo 1" \
2 "Opo 2" \
3 "Opo 3" 2>/tmp/arquivotemporario
Este mtodo f il, mas um pou o desagradvel depender de um arquivo externo,
prefervel utilizar a segunda opo, onde onseguimos passar a sada do dialog
diretamente para uma varivel:

OPCAO=`dialog --stdout --menu "\


Sele ione uma opo do menu" 0 0 3 \
1 "Opo 1" \
2 "Opo 2" \
3 "Opo 3"`
Logo depois de exe utar o dialog, a sada dele estar na varivel OPCAO, bem
mais prti o. A opo --stdout serve para dire ionar a sada do dialog (que
tradi ionalmente vai para o stderr, para a sada padro) e om isso, tornando
possvel aptur-la em variveis.
Vamos passar agora para a --radiolist, podemos dizer que esta um "modelo" diferente de menu, sero apresentadas vrias opes para vo sele ionar e,
omo no --menu, apenas uma delas pode estar sele ionada:

dialog --radiolist
1 "Opo 1"
2 "Opo 2"
3 "Opo 3"

"Sele ione uma opo do menu" 0 0 3 \


ON \
OFF \
OFF

Lembre que apenas uma das opes pode estar ativa, repare que tambm j deixamos uma opo sele ionada "por default. Esta uma vantagem, j que  a bem
laro qual opo nos re omendamos ao usurio. Para saber qual foi a es olha do
usurio, temos os dois mtodos j apresentados para a --menu.
Na nossa ordem de omplexidade, vamos agora poder pegar vrias opes em
uma s tela, para isso temos a -- he klist. A -- he klist uma parente da
--radiolist, sendo ambas muito semelhantes, a grande diferena que podemos sele ionar mais de uma opo, enquanto na --radiolist, no usta repetir,
podemos utilizar apenas uma:

CAPTULO 4.

APARNCIA TUDO...

46

dialog -- he klist "O que pretende apagar?" 0 40 3 \


usuarios "Todos os usurios" ON \
programas "Todos os programas" ON \
tudo "Tudo mesmo..." OFF
A sada desta aixa o nome das vrias opes sele ionadas, ada uma delas entre
aspas. Isso atrapalha um pou o para trabalhar om essas opes. Uma boa idia
utilizar o --separate-output isso far om que a sada seja dada uma opo
por linha.
Por ltimo, uma aixa sem opo, em que o usurio pode fazer o que quiser, a
--inputbox. Este o tipo de aixa que vo vai es olher quando for pedir para o
seu usurio es rever algo. Para oletar o que o seu usurio digitou, vo j deve
saber o que fazer.

dialog --inputbox "Es reva aqui alguma bobagem" 0 0


Usar o dialog uma maneira f il de fazer om que seus s ripts tenham uma outra
aparn ia, e impressionar o usurio nal. Eles sempre  am impressionados om
ores, sombras e menus... at engolem sistemas que no fun ionam... os nossos,
alm de fun ionar, tambm so simpti os -:)

Captulo 5
Trabalhando one tado
A maior parte dos usurios de shell s ripts so administradores de sistemas e administradores de rede. E, omo administradores de rede, muitas vezes ne essrio
utilizar a rede para as tarefas dirias. Vamos dar uma olhada neste aptulo em
alguns omandos e maneiras de se trabalhar utilizando a rede.
Ns vimos rapidamente no aptulo 1 um uso da rede, om o omando ping.
Atravs dele, podemos ver se um site est vivo ou morto (ou se a nossa onexo
de rede est fun ionando). Mas, depois de veri ar se a mquina est viva, seria
interessante que soubssemos disso... por exemplo, om um e-mail avisando. Este
aptulo um pou o mais omplexo que os anteriores, anal, alm dos on eitos
de shell s ript usamos muitos on eitos de redes.

5.1

Mandando e-mails

A maneira mais simples (e bvia) de se mandar um e-mail atravs do omando

mail. Com ele podemos mandar uma frase, ou todo um arquivo texto om razovel
fa ilidade:

punkfrankenstein:~$ e ho "A mquina X fale eu" | \


mail -s "ALERTA" punkra hael
Isso ir mandar uma mensagem om o ontedo A mquina X fale eu, om o
assunto ALERTA para o endereo punkra hael. O maior problema para esta
abordagem a ne essidade de haver um servidor de e-mail (MTA) fun ionando na
mquina em que vo envia o e-mail.
Podemos ontornar isso de uma maneira levemente mais ompli ada, nos
omuni ando diretamente om um servidor de e-mail. Normalmente temos a esso
a algum, nem que seja dos nossos e-mails pessoais.
47

CAPTULO 5.

TRABALHANDO CONECTADO

48

Assim que one tarmos, iremos utilizar os omandos prprios do SMTP (que
o proto olo utilizado para enviar e-mails). Podemos veri ar omo isso fun iona
utilizando o omando telnet:

punkfrankenstein:~$ telnet ra hael 25


Trying 192.168.0.2...
Conne ted to ra hael.
Es ape hara ter is '^'.
220 ra hael.mylab ESMTP Sendmail 8.12.9/8.12.9; Wed, 3 Mar 2004 \
01:09:56 -0300
MAIL FROM: punkfrankenstein
250 2.1.0 punkfrankenstein... Sender ok
RCPT TO: punkra hael
250 2.1.5 punkra hael... Re ipient ok
DATA
354 Enter mail, end with "." on a line by itself
La le li
.
250 2.0.0 i2349uYi001881 Message a epted for delivery
QUIT
221 2.0.0 ra hael.mylab losing onne tion
Primeiro one tamos no servidor desejado (ra hael) e na porta utilizada pelo
SMTP (25). As respostas do servidor, no nosso aso, so as linhas om nmeros
no ini io, estes nmeros so digos aliengenas. Depois de one tado, enviamos
os omandos ne essrios:

MAIL FROM: punkfrankenstein - Avisa que o e-mail para ser enviado


omo sendo de punkfrankenstein. Logo aps o omando, o servidor nos
responde que est OK. Algumas vezes, antes deste passo, ne essrio utilizar
o omando HELO, mas nem sempre isso pre iso.
RCPT TO: punkra hael - Agora passamos quem ser o destinatrio da mensagem (ou seja, quem vai re eber) e determinamos que ser punkra hael,
novamente o servidor nos d o seu OK. Muitos MTAs ne essitam que os
e-mails sejam es ritos entre < e >.
DATA - A partir daqui, iremos es rever o ontedo do nosso e-mail, ele termina
om um . sozinho em uma linha. Depois de tudo es rito e do . digitado,
o servidor nos avisa que a mensagem foi a eita
QUIT - Finalmente, des one tamos do servidor.

CAPTULO 5.

TRABALHANDO CONECTADO

49

Agora que j sabemos os omandos que devemos usar, est na hora de enviarmos
o nosso e-mail, mas ele ser enviado atravs de um simples at... veja omo:

punkfrankenstein:# at < <EOF >/dev/t p/ra hael/25


> MAIL FROM: punkfrankenstein
> RCPT TO: punkra hael
> DATA
> La la la
> .
> QUIT
> EOF
E pronto! O e-mail foi enviado -:) A parte do < <EOF vo j onhe e mas, provavelmente, o /dev/t p/ra hael/25 novidade. no ? Esse redire ionamento apenas
est enviando a sada do omando at para a mquina ra hael, na porta 25, usando t p. um re urso muito simples porm pou o utilizado.
Com este onhe imento, podemos fazer o nosso prprio omando mail. Aproveitando essa nossa boa fase de genialidade, vamos hamar o nosso mail de nossomail
(original, no?)

#!/bin/sh
#
# nossomail - s ript superinteligente para enviar e-mails
#
# Verifi a a quantidade de argumentos, se for apenas
# um, pega a mensagem a ser enviada diretamente do stdin
#
# Caso ontrrio, usa o segundo argumento omo mensagem
#
if [ "$#" = "1" ; then
MSG=` at -`
else
MSG="$2"
fi
FROM="$USER$HOSTNAME"
TO="$1"
HOST=`e ho $1 | ut -f2 -d`
at < <EOF >/dev/t p/$HOST/25
MAIL FROM: $FROM
RCPT TO: $TO
DATA

CAPTULO 5.

TRABALHANDO CONECTADO

50

$MSG
.
QUIT
EOF
No existem maiores segredos no s ript, j que todos os on eitos j foram utilizados anteriormente (espero que vo s ainda lembrem dos outros aptulos). Podemos utilizar este nosso s ript de duas maneiras, uma delas enviando a mensagem
na prpria linha de omando:

punkfrankenstein:~$ ./nossomail punkra hael "Teste"


A outra maneira enviando a mensagem atravs de um pipe:

punkfrankenstein:~$ e ho TESTE | ./nossomail punkra hael


Pronto! Mais um exemplo que tambm um

5.2

s ript til!

Tro ando arquivos

Alm de mandar e-mails, um outro uso tpi o para uma rede a transfern ia de
arquivos. Existe uma srie de omandos interessantes para utilizarmos em nossos
s ripts e manipularmos arquivos em rede.
O primeiro da lista o wget. Ele pode ser utilizado para baixar sites inteiros,
tanto via http (Web) omo por ftp (ftp ftp mesmo) e muito til. Podemos
imaginar um uso bem simples, todo dia, a lial da sua empresa em Laodi ia do
Oeste disponibiliza um arquivo om o ba kup daquele dia. Ba kups ostumam ser
muito grandes para se enviar por e-mail (e, s para onstar, um arquivo enviado
por e-mail aumenta de tamanho). Ah, esses ba kups devem ser gravados na sede
da empresa...
A melhor oisa a fazer aproveitar o horrio da madrugada, quando no ostuma haver ningum trabalhando e muito menos usando a banda e trazer o arquivo.
Vamos usar o wget.

wget http://laodi eia.xingling. om.br/ba kups/ba kup_de_hoje


Pronto! Este o omando. Basta digit-lo e o ba kup ser trazido at vo ,
omo que por mgi a. Isso ir baixar o arquivo ba kup_de_hoje que est no diretrio ba kups dentro da mquina laodi eia.firma-xingling. om.br atravs
de http. Este nosso primeiro omando tem um pequeno problema: onde ele vai
guardar o arquivo que baixar?

CAPTULO 5.

TRABALHANDO CONECTADO

51

Se vo digit-lo no prompt, ele vai baixar o arquivo no diretrio em que estiver.


Mas, ostuma-se olo ar ba kups em lugares espe  os. Muito mais agradvel
seria usar:

wget -O /ba kup \


http://laodi eia.xingling. om.br/ba kups/ba kup_de_hoje
Pronto! Agora  ou bom. Se o arquivo fosse disponibilizado via ftp, poderamos
usar o wget tambm, apenas tro ando onde est http:// por ftp://.
E se fosse o aso inverso? E se ns tivssemos que enviar um arquivo para a
lial de Otonpolis do Sul? Talvez um relatrio... bom, se for por ftp podemos
usar o timo n ftp. Ele agrega vrios omandos utilssimos para transfern ias de
arquivos via s ripts. No nosso aso de enviar arquivos, o omando apropriado o
n ftpput, uja sintaxe :

n ftpput -u usuario -p senha maquina-remota aminho arquivo-lo al


Se quisssemos enviar o arquivo Exemplo1 para o diretrio aulas_shell/rede da
mquina maquina_remota. Ou seja, para o ftp://maquina_remota/aulas_shell/rede/
iramos fazer assim:

n ftpput -u usuario -p senha maquina_remota aulas_shell/rede Exemplo1


Onde indi a o usuario e a senha, vo olo a o usurio e senhas apropriados.
Podemos tambm utilizar o n ftp para baixar arquivos, atravs do n ftpget. Ele
possui uma sintaxe mais simples que a do n ftpput.

n ftpget -u usuario -p senha ftp://exemplo.servidor/dir/arquivo


Vale a pena dar uma boa explorada nesses omandos, onsulte a man-page deles
e o help. Muitos problemas insolveis podem ser resolvidos por eles, experin ia
prpria.
5.2.1

HTML...

Existem momentos em que no queremos baixar o arquivo HTML em si, e sim a


pgina j renderizada. Dependendo do que queremos fazer, pode ser muuuito mais
simples en ontrar uma determinada informao na pgina j formatada.
Para esses asos, uma boa opo seria utilizar o lynx. Como exemplo, irei
utilizar esta pgina:

CAPTULO 5.

TRABALHANDO CONECTADO

52

<HTML>
<HEAD>
<TITLE>Exemplo</TITLE>
</HEAD>
<BODY>
<OL>
<LI>Um item <LI>outro item
<LI>mais um
<LI>e mais outro
</OL>
</BODY>
</HTML>
Vamos supor que o nosso objetivo fosse pegar o segundo item (o  outro item)
omo faramos esse s ript ? Impossvel no , mas om erteza seria bem mais
simples om a pgina j devidamente formatada. Veja omo ela  a depois de
renderizada pelo lynx:

punkra hael:~$ lynx -dump exemplo.html


1. Um item
2. outro item
3. mais um
4. e mais outro
Agora qualquer um que onhea um pou o de
segundo item -;)

shell s ript j sabe omo pegar o

punkra hael:~$ lynx -dump exemplo.html | grep 2 | ut -f2 -d.


outro item
Aproveitamos para retirar o 2. da frente. Para redire ionar a pgina j formatada
para um determinado arquivo, basta utilizar o >, omo j visto anteriormente.
Outro uso muito importante do lynx para a essar pginas. Com um pou o
de onhe imento, possvel enviar formulrios j preen hidos atravs da linha de
omando, bastando olo ar o ontedo dos ampos diretamente na URL... mas
isso varia de formulrio para formulrio... e j estamos no nal da apostila. Espero
que tenha o ontedo dela tenha sido til para dar uma pequena introduo aos
shell s ripts. Agora olo ar a mo na massa...

Apndi e A
Usando O editor de textos: VI

A.1

Des revendo o VI...

O VI o editor de textos padro do mundo *NIX. Qualquer sistema opera ional


que seja ompatvel om o UNIX, ou que seja nele inspirado possui a sua verso
do VI. Isto tem um motivo, alm de ser um dos editores de texto mais tradi ionais
do mer ado, tambm um dos mais poderosos.
Normalmente, as distribuies Linux no vem om o VI original, mas sim
om lones omo o VIm, elVIs e nVI. Ou, s vezes, om todos eles -;). Todos
so idnti os nas fun ionalidades bsi as, mudando um pou o nas funes mais
avanadas.
O VI possui dois modos de trabalho, o modo de edio (onde vo es reve o
texto propriamente dito) e o modo de omando, onde podemos passar omandos
para ele. Normalmente, quando abrimos o VI (ou o seu lone preferido), ele est
no modo de omando. Nos nossos exemplos, iremos usar o elvis, mas boa parte
do que se apli a, se apli a a outros lones...

A.2

Editando textos...

Para sair do modo de omando e entrar no modo de edio, aperte i. Isso, a letra
i. Com isso vo ir entrar no modo de insero (tem outras maneiras de entrar
no modo de edio, mas essa a mais omum).
A partir de agora, vo pode es rever o seu texto vontade. Para es rever,
basta ir es revendo e, para navegar no texto, o elvis permite que vo use as
setas e os omandos PgUp, PgDn, Home e End. Vo pode apagar o texto que
es reveu utilizando o Ba kspa e.
Para realizar algumas outras oisas, ne essrio voltar ao modo de omando.
Para isso, pressione a te la ESC. No modo de omando, existem vrios atalhos de
53

APNDICE A. USANDO O EDITOR DE TEXTOS: VI

54

te las para fa ilitar a edio de textos.


A.2.1

Navegando pelo texto

Apesar das setinhas fun ionarem no elvis, elas no fun ionam no vi padro,
ento bom onhe er omo fazer os movimentos do jeito  erto. Todos estes
omandos de movimentao devem ser dados no modo de omando.
Os mais bsi os so:

j,k,h,l -> respe tivamente: para baixo, para ima, para a esquerda e para
a direita. Vo pode substituir o l pela barra de espaos
enter -> Vai para o in io da prxima linha (no...)
0 -> Comeo da linha (ateno, 0 um zero e no um o mais ulo)
$ -> Final da linha
w,b -> Caminham pelas palavras, w para frente e b para trs.
:/,? -> Pro ura por um padro (o uso :/padro ou ?padro), o :/ vai
para frente e o ? para trs. Para os preguiosos, o n repete a ltima bus a.
Existem outros, mas estes so su ientes para navegarmos no texto e ainda fazermos alguns truques -;).
A.2.2

Mar ando textos

Vo pode mar ar reas retangulares do texto om o Ctrl+V. Apenas pressione


essas te las e sele ione o texto desejado om as setas. Aps sele ionar o texto,
pressione y para opiar. Mova o ursor at a posio em que deseja opiar o texto
e aperte p. Se, ao invs de opiar o texto sele ionado vo preferir apag-lo, troque
o y pelo d.
Se no gostar de demar ar retngulos, pode mar ar linhas inteiras utilizando o
atalho Shift+V e depois movendo o ursor pelas linhas desejadas. Se quiser opiar
apenas a linha em que est, utilize o yy.
Um re urso muito til para quem programa, utilizar o > ou o < sobre o texto
sele ionado. Isso faz om que ele aumente ou diminua uma indentao, tornando
o digo muito mais legvel. A redite, isso uma mo na roda enquanto editamos
um shell s ript.

APNDICE A. USANDO O EDITOR DE TEXTOS: VI

A.2.3

55

Apagando

Bom, vo viu que apagar textos mar ados apertando d. Para apagar outras
oisas tambm assim... E ainda possvel aproveitar outros re ursos... por
exemplo, se vo apertar a letra d, e depois o nmero 5 e por m a seta para a
direita, ir apagar 5 ara teres para a direita. Se zer isso e apertar a seta para a
esquerda, ir apagar 5 ara teres para a esquerda e, se apertar a seta para ima,
ou para baixo, ir apagar 5 linhas nessas direes.
Normalmente, o que se mais utiliza o d(seta para o lado) para apagar apenas
um ara ter. Outro muito utilizado o D que apaga a partir da posio do ursor
at o nal da linha e o dd que apaga a linha inteira.
Um texto apagado, pode ser olado utilizando o omando p.
Se vo estiver usando o d para apagar o nal de uma linha para olar uma
linha na outra, est usando o omando errado... para fazer isso, use o J de Join
(ou seja, juntar). Leia e lembre disso, ir lhe poupar dores de abea futuras...

A.3

Saindo do VI e outros adi ionais...

Como sempre, sobram alguns omandos que a gente no sabe onde deve olo ar...
eu resolvi que devo olo ar aqui -;)
A.3.1

Sair do VI

Para sair do VI, salvando o arquivo que vo es reveu, use :wq, se no quiser
salvar, use :q! , om a ! no nal mesmo. Saber sair do VI muito importante,
normalmente a primeira oisa que a onte e om os marinheiros de primeira
viagem:  am presos. Agora vo no ir air nessa. (OK, mas pode air em
outras armadilhas...)
A.3.2

Lendo um arquivo no VI

Esta outra boa... enquanto vo estiver editando um arquivo, pode pre isar do
ontedo de algum outro... para isso, use o :r nome_do_outro_arquivo, o tal
nome_do_outro_arquivo ser arregado logo abaixo do ursor.
Vo tambm pode fazer um truque! O :! utilizado para exe utar um
omando, om :r!date por exemplo, vo ir inserir o resultado do omando
date no seu arquivo! (Di a boa!!!)

APNDICE A. USANDO O EDITOR DE TEXTOS: VI

A.3.3

56

Substituies

Existem vrias outras maneiras, mas es olhi uma opo espe ial para ns que
somos quase experts no sed (anal, vimos alguns pargrafos sobre ele no Captulo
3). Ela tem mais ou menos a mesma sintaxe do sed.

:s/padro1/padro2/
Isso ir substituir onde est padro1 pelo padro2. Mas apenas na primeira
o orrn ia na linha em que estiver o ursor... usando: :s/padro1/padro2/g,
vo substitui o texto na linha inteira e, usando um % antes do s, vo realiza
substituies no texto inteiro!!!
Como foi possvel ver utilizando o %, possvel limitar a ao do omando de
substituio (bom, no aso espe  o do %, ns limitamos a substituio ao texto
inteiro). Mas podemos fazer diferente:

:1,3s/padro1/padro2/g
Isso ir substituir padro1 por padro2 nas linhas de 1 a 3. E, ateno para a
di a: . a linha atual, e $ o nal do arquivo. D para fazer alguns intervalos
interessantes utilizando esses dois. Ah! E se vo quiser repetir a sua ltima
substituio, use :&. E, para desfazer a sua ltima ao, use o omando u.

A.4

Conguraes...

Algumas onguraes interessantes. Quando so utilizadas om freqn ia, so


olo adas em um arquivo do tipo .vimr , .exr , et ... Para olo -las enquanto
est editando um arquivo, vo deve primeiro passar para o modo de omando e
fazer:

:set autoindent
Isso ir ativar a indentao automti a (til para quem est programando). Para
desativar a indentao, use:

:set noautoindent
Se quiser olo -los em um arquivo, basta ir olo ando os omandos um abaixo
do outro, sem os dois pontos ini iais. Alguns arquivos .vimr a abam  ando
quilomtri os... para quem usa o vim, dentro da do umentao do programa ostuma  ar o vimr _example.vim que um timo e bem ompleto exemplo...
Algumas das opes que podemos usar so

APNDICE A. USANDO O EDITOR DE TEXTOS: VI

57

autoindent -> Seta a indentao automti a


number -> Numera todas as linhas. Os nmeros no so salvos junto om o
arquivo.
showmat h -> Quando vo es reve um (, [ ou {, ele dete ta o orrespondente
}, ou ). Outro til para programadores...
list -> Mostra as tabulaes omo I e os nais de linha omo $. timo
para des obrir o que uma tabulao e o que espao. Tambm para
en ontrar espaos perdidos no nal das linhas (e que dependendo do lugar
ausam problemas exti os).
Existem dzias de outras opes destas... utilize :set all para ver todas, e de idir
se quer utiliz-las. Muitas vezes, a ongurao default mais que su iente.

Apndi e B
Comandos teis...
Depois de ler todo o ontedo deste livro, podemos esque er algumas oisinhas,
ou pre isar rapidamente lo alizar um omando. Aqui esto listados alguns dos
omandos mais utilizados em shell s ripts, separados por funo.
Lembrando que o ontedo presente aqui apenas um pequeno resumo e, sequer, hega aos ps da do umentao destes omandos, que pode ser visualizada e
onsultada atravs do omando man. A ostume-se om ele, ele seu amigo. Para
usar, basta fazer:

# man nome_do_ omando


Com isso vo ter a esso a uma quantidade in rvel de informaes. Comandos
mais omplexos omo o sed e o awk no apare em neste apndi e. Apesar de
muito utilizados, ne essrio prati amente um livro para expli ar ada um deles.

B.1

...para manipular arquivos...

B.1.1

ls - Listar arquivos

O omando ls lista os arquivos ontidos em um diretrio (ou no diretrio em que


estamos). Por exemplo:

ls /tmp
Ir listar todos os arquivos do /tmp. Existem uma srie de opes que podem ser
dadas em onjunto om o omando ls. Podemos itar algumas:

-l -> lista os arquivos e seus atributos


-a -> lista os arquivos o ultos
58

APNDICE B. COMANDOS TEIS...

59

-R -> lista re ursivamente o diretrio desejado e seus subdiretrios


-h -> olo a os tamanhos de arquivos em formato humano, 4k ao invs de
4096, 1M ao invs de 1048576 e assim por diante.
Estas opes podem ser ombinadas de diferentes formas. Ex: ls -laRh
B.1.2

rm - Remover arquivos

Remove um arquivo (ou lista de arquivos). bom lembrar que nem sempre
(traduo: quase nun a) possvel re uperar um arquivo apagado, por isso, faa
ba kups e tome uidado. Opes teis:

-i -> Pergunta antes de remover o arquivo.


-r -> Re ursivo, apagando o interior dos diretrios e os prprios.
-f -> Fora a remoo do arquivo (CUIDADO)
E, para no  armos rfos, um exemplo de uso:

rm -rf arquivo1 arquivo2 diretorio3


B.1.3

mv - Movendo e Renomeando arquivos

Move um arquivo de um lo al para outro na rvore de diretrios. possvel usar


este omando omo um truque para renomear arquivos, movendo-os para o nome
novo:

mv nome_velho nome_novo
Ou, na sua outra forma:

mv / aminho/antigo/do/arquivo /lugar/novo/do/arquivo
As duas formas a eitam as opes -f e -i, sendo que a primeira faz om que o
omando mv sobres reva o arquivo novo, aso j exista um arquivo om este nome,
e a segunda pergunta antes de sobres rev-lo.

APNDICE B. COMANDOS TEIS...

B.1.4

60

p - Copia arquivos

O omando p, opia arquivos e diretrios. Podendo (in lusive) tro ar o nome


destes arquivos e diretrios no pro esso da pia, ou manter o mesmo nome, desde
que os arquivos sejam opiados para uma lo alizao diferente da original. O modo
de uso simples:

p arquivo_original opia_do_arquivo
Ou

p arquivo_original /outro/lugar/para/o/arquivo_original
Claro que possvel opiar o arquivo para outro diretrio om um nome diferente,
basta espe i ar qual seria esse nome. Alm disso, o omando p possui vrias
opes:

-f -> Sobres reve os arquivos de destino, aso possuam os mesmos nomes


-i -> Pergunta antes de sobres rever os arquivos.
-p -> Copia preservando todos os atributos, grupos, permisses, et ...
-R -> Copia re ursivamente, opiando diretrios, subdiretrios e seus ontedos.
-a -> Tenta manter a maior quantidade de informao possvel dos arquivos
opiados.
B.1.5

le - des obre o tipo do arquivo

No pre isa de maiores expli aes. Basta usar:

file nome_do_arquivo
E o omando retorna o tipo de arquivo om que estamos trabalhando.
B.1.6

mkdir - Cria diretrio

Para riar um diretrio, usamos o omando mkdir, om a seguinte sintaxe:

mkdir nome_do_diretorio
possvel espe i ar tambm um aminho inteiro:

mkdir / aminho/para/o/nome_do_diretorio
E, se este aminho no existir, possvel ri-lo utilizando a opo -p:

mkdir -p / aminho/para/o/diretorio/nome_do_diretorio
Para remover o diretrio riado, podemos usar o rmdir ou, o j onhe ido, rm.

APNDICE B. COMANDOS TEIS...

B.2

61

...para trabalhar om textos...

B.2.1

at - O texto na tela

O prin ipal uso do at mostrar o ontedo de um arquivo na tela. Claro, om os


redire ionamentos que aprendemos, podemos mandar este ontedo para qualquer
lugar que quisermos.
Uma opo interessante do at a -n, que numera as linhas que so apresentadas pelo omando at, fa ilitando sele ionar apenas uma determinada linha.
Existe um omando irmo do at, o ta que mostra o arquivo em modo reverso,
om as ltimas linhas sendo mostradas primeiro (e, obviamente, as primeiras sendo
mostradas por ltimo)
B.2.2

head - Mostra o in io do arquivo

O omando head imprime as primeiras 10 linhas de um arquivo. Se utilizarmos a


opo -N (onde N um nmero) sero impressas as primeiras N linhas do arquivo.
Como no exemplo:

head -5 arquivo
B.2.3

tail - Mostra o nal de um arquivo

Prati amente idnti o ao head, mas trabalhando om o nal do arquivo ao invs


de om o omeo. Uma boa opo a -f para quando estiver observando arquivos
de log. Neste aso o tail no pra, ele ontinua mostrando as ltimas linhas do
arquivo e as linhas que forem sendo adi ionadas nele. O uso do tail :

tail -7 arquivo
B.2.4

grep - En ontrando o que se pro ura

O omando grep utilizado prin ipalmente para se lo alizar um texto espe  o (ou uma expresso regular) dentro de um (ou mais) arquivos. O omando
extremamente poderoso e possui uma srie de opes.
A sintaxe default :

grep [-opes texto_ou_expresso_regular arquivo


Ao invs de arquivo, podemos passar a sada de outros omandos para o grep,
via pipe. Uma expli ao mais detalhada do uso do omando e de expresses
regulares pode ser en ontrada no Captulo 3.

APNDICE B. COMANDOS TEIS...

B.2.5

62

ut - Corta um pedao do texto

A sintaxe mais omum do ut :

ut -fn -ddelim arquivo


Onde n o nmero do ampo e
omando:

delim o delimitador utilizado. Por exemplo, o

e ho um dois trs | ut -f2 -d' '


Ir retornar dois que o segundo ampo delimitado por espaos. Tambm
possvel mostrar vrios ampos de uma s vez:

-f2-4 -> Ir mostrar os ampos dois, trs e quatro


-f3- -> Ir mostrar todos os ampos, a partir do ter eiro
-f-4 -> Mostra todos os ampos, do in io at o quarto ampo.
Lembrando que, omo vimos no exemplo, ao invs de arquivo podemos utilizar a
sada de outro omando, atravs do pipe.
B.2.6

sort - Ordena um texto

O omando sort olo a um texto em ordem. possvel ordenar de vrias maneiras


um arquivo, em ordem alfabti a, em ordem numri a, em ordem reversa, et ... a
sintaxe :

sort [-opes arquivo


E, as tais opes podem ser:

-n -> olo a em ordem numri a


-r -> ordem reversa
-d -> ordem do di ionrio
Entre vrias outras que podem ser vistas na manpage do sort. O ompanheiro
inseparvel do sort o uniq, que elimina linhas repetidas em um arquivo.

APNDICE B. COMANDOS TEIS...

B.2.7

63

tr - tro a ara teres

O omando tr tro a ara teres isolados ou em grupos. Com ele possvel tro ar
todas as mais ulas por mins ulas, apagar determinado ara tere ou ara teres
repetidos. A sintaxe padro :

tr [-opes grupo1 [grupo2


Por exemplo, para tro ar mais ulas por mins ulas:

tr A-Z a-z
Lembre que a entrada do tr via pipe. Opes teis in luem:

-d -> apagar os ara teres en ontrados no grupo1


-s -> apaga ara teres repetidos
B.2.8

fold - enquadra textos

O omando fold usado para enquadrar textos em um determinado tamanho.


Por exemplo, podemos passar um texto inteiro para 40 olunas om o omando:

fold -w 40 arquivo
Bastante til no trabalho om textos, anal, nun a se sabe om qual formato deles
hegam...

B.3

...sobre o sistema e...

B.3.1

ps - mostra os pro essos no sistema

O omando ps mostra os pro essos em exe uo no sistema (juntamente om vrias


informaes). Para ajudar a onfundir, ele suporta duas sintaxes diferentes. Ou
seja, vo pode es rever seus omandos de duas maneiras diversas e ter o mesmo
resultado (ou algo muito pare ido).
O ps possui vrias e vrias opes. No iremos mostrar (nem de longe) todas
as elas. As opes no estilo SysV so utilizadas om um - na frente das opes.
As opes BSD so sem o -. Por exemplo:

# ps ef

64

APNDICE B. COMANDOS TEIS...

Ir mostrar os pro essos do usurio, em forma de rvore e om todas as variveis de


ambiente logo aps o nome do pro esso que est sendo exe utado. J o omando:

# ps -ef
Ir mostrar todos os pro essos em exe uo na mquina om vrios dados detalhados. Este tipo de omportamento torna parti ularmente dif il passar uma lista
de opes. Algumas interessantes so:

ax -> Mostra todos os pro essos em exe uo.


x -> Todos os pro essos do usurio.
u -> Mostra o usurio responsvel pelo pro esso (entre outras oisas).
-e -> Todos os pro essos em exe uo (o mesmo do ax).
-f -> Expe os pro essos em formato de rvore.
A manpage mostra vrios outros. In lusive, o su iente para sequer onfundir
realmente bastante. Use as opes obs uras om uidado. Se vo gosta do ps -f,
divirta-se om o pstree.
B.3.2

free - informaes sobre a memria do sistema

Mostra a quantidade de memria livre no sistema. Este omando mostramos om


detalhes no meio do texto, mas mostramos tambm a maior parte dos outros que
apare em neste apndi e...

punkra hael:~$ free


total
used
Mem:
256148 130316
-/+ buffers/ a he:
45168
Swap:
265032
0

free
125832
210980
265032

shared
0

buffers
8636

a hed
76512

Na primeira linha, temos o total de memria, a quantidade utilizada (in luindo


os buers e o a he ). Na segunda linha temos algo mais prximo da realidade,
mostrando a memria utilizada sem trabalhar om a he e o buer. Por m, na
ltima linha, temos a utilizao da memria swap.
Existem algumas opes para alterar a sada do programa:

-o -> No mostra a linha  -/+ buffers/ a he:


-t -> Mostra o total de memria, somando a

swap om a memria RAM.

-m -> A quantidade de memria mostrada em Megas, ao invs de Kilobytes.

APNDICE B. COMANDOS TEIS...

B.3.3

65

uname - identi ao do sistema

Mostra prati amente tudo sobre a sua mquina. O nome da mquina, o sistema
opera ional, a arquitetura, ompilao do kernel, verso do kernel, et ... por exemplo:

punkra hael:~$ uname -n -r -m -o


ra hael 2.4.22 i686 GNU/Linux
Com isto estamos mostrando o nome da mquina (-n), a verso do kernel (-r),
o tipo de hardware (-m) e o sistema opera ional (-o). Caso queira ver todas as
informaes disponveis, possvel utilizar a opo -a.
B.3.4

date - a data do sistema

O omando date apresenta a data e hora do sistema. bem til para fazer arquivos
om o nome do dia (por exemplo, arquivos de ba kup). Es rever simplesmente
date, retorna algo do tipo:

Fri Mar 26 00:16:49 BRT 2004


Mas possvel ongurar a sada do omando date para oisas mais ivilizadas
(ou, pelo menos, melhores para olo ar em nome de arquivo). Faa assim:

punkra hael:~$ date +%Y_%m_%d


2004_03_26
Estes %alguma oisa, tem um signi ado espe ial, omo podemos ver abaixo:

%Y -> Ano, om quatro dgitos, se quiser om dois, use o %y


%m -> Ms, de forma numri a
%b -> Nome do ms, abreviado. Se quiser o nome inteiro, use %B.
%H -> hora ( om dias de 24 horas orridas... e no 12 horas AM e 12 horas
PM)
%M -> minutos
Di a de amigo, guarde a data no formato que lhe agradar em uma varivel... vo
pode pre isar disso vrias vezes durante um s ript.

APNDICE B. COMANDOS TEIS...

B.3.5

66

mount - Vendo os sistemas de arquivos montados

O omando mount mostra todos os dispositivos montados (ou sistemas de arquivos


remotos), seus pontos de montagem, o tipo de sistema de arquivos e as opes de
montagem.
Vo tambm pode usar o omando mount para montar um sistema de arquivos.
A sintaxe a seguinte:

mount [-t tipo_de_fs [-o opes dispositivo ponto_de_montagem


Re omendao: ler a manpage antes de omear a trabalhar om as opes do
omando. Vrias delas s fun ionam em determinados sistemas de arquivos. Se for
utilizado apenas o mount, vo ver as informaes des ritas no primeiro pargrafo
deste item.

B.4

...para outras oisas

Alguns omandos que no se enquadram nos des ritos a ima, mas so muito teis
mesmo assim:
B.4.1

ping - Veri a se uma determinada mquina est viva

timo para examinar se uma mquina est respondendo, se est a essvel ou para
ter alguma idia de omo est a rede. Use o omando ping assim:

ping nome_da_maquina
Ele omear a fazer innitos pings para a mquina desejada. O ping innito no
dos melhores para usarmos em s ripts. Geralmente utilizamos algumas opes:

- n -> Limita o nmero de pings. Sero realizados apenas n pings.


-w n -> Espera no mximo n segundos para re eber a resposta do ping
enviado.
Com estas duas mais f il dete tar se uma determinada mquina est viva ou
morta (o -w ajuda bastante a evitar uma espera prati amente eterna).

APNDICE B. COMANDOS TEIS...

B.4.2

67

m ookie - Gera um digo (teori amente) ni o

Este omando muito til para se nomear arquivos temporrios. Apenas faa, no
omeo do seu programa:

TEMP=seu-programa-`m ookie`.tmp
Com isso, vo tem a erteza de que seu arquivo temporrio no vai apagar o
de outro usurio (ou vi e-versa). Arquivos omo /tmp/temp.tmp pedem para ser
apagados ou para algo horrvel a onte er om eles.
B.4.3

z at - mostra um arquivo ompa tado om o gzip

Vo pode guardar um arquivo ompa tado e mostr-lo na tela diretamente, sem


a ne essidade de des ompa t-lo antes do uso. A sintaxe simples:

z at nome_do_arquivo
Para abrir arquivos do bzip2, vo pode utilizar o bz at.
B.4.4

zgrep - pro ura por um texto no interior de um arquivo ompa tado om o gzip

Bom, da mesma maneira que o z at, o zgrep foi feito para trabalhar diretamente
om arquivos ompa tados. Ele (internamente) utiliza o omando grep, tendo a
mesma sintaxe.
E, de novo, temos o lone do zgrep para quando for usar arquivos .bz2, o
bzgrep.
B.4.5

tee - es reve algo na sada padro e em um arquivo


ao mesmo tempo

til para arquivos de log. Com o omando tee, a mesma sada pode ser mandada
tanto para a sada padro omo para um arquivo, assim, vo pre isa mostrar
as tuas mensagens apenas uma vez. A opo -a garante que o arquivo no seja
apagado pelo prprio tee toda vez que for invo ado, om ela, as mensagens so
olo adas sempre no nal do arquivo.
Um exemplo:

e ho Tudo fra assou! Erro mortal | tee -a /var/log/s ript.log


Com isso, a frase passada pelo omando e ho ser apresentada na tela e no arquivo
/var/log/s ript.log.

Refern ias Bibliogr as


[1 Jargas, A. M. 2001, Expresses
Paulo, Novate Editora

Regulares - Guia de Consulta Rpida. So

[2 Raimundo, R. M. 2000, Curso Bsi o


S ript. Rio de Janeiro, Book Express
[3 Robbins, A. D. 1997, Ee tive
Systems Consultants, In
[4 Saade, J. 2001, Bash

de Programao em POSIX-Shell

AWK Programming 2ed. Seattle, Spe ialized

- Guia de Consulta Rpida. So Paulo, Novate Editora

68

Anda mungkin juga menyukai