2004
Sumrio
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . .
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
O mtodo COBOL . . . . . . .
O mtodo
riptogr
o . . . . .
O bom e velho linha e
oluna
O menu de bolso . . . . . . . .
Usando Dialog . . . . . . . . . .
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
B Comandos teis...
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
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:
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...
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 '$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
1.4
Redire ionando...
CAPTULO 1.
CONHECENDO O BASH
10
1.5
Temos variveis, redire
ionamentos, atribuies... mas ainda no temos
omo fazer
um simples 2+2. Experimente:
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:~$
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
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:
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:
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
CAPTULO 2.
PROGRAMANDO
15
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
#!/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:
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
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
#!/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:
CAPTULO 2.
PROGRAMANDO
20
#!/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!
#!/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 :
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:
CAPTULO 2.
PROGRAMANDO
22
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!
CAPTULO 2.
PROGRAMANDO
24
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
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
used
237784
81736
72
free
18364
174412
264960
shared
0
buffers
19200
a
hed
136848
CAPTULO 3.
27
264960
CAPTULO 3.
28
CAPTULO 3.
29
CAPTULO 3.
30
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 :.
CAPTULO 3.
3.2
31
Organizando
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:
CAPTULO 3.
32
CAPTULO 3.
33
CAPTULO 3.
34
{
om "$5" de o
upao"
77% de o
upao
82% de o
upao
#!/bin/sh
free | awk '
BEGIN {
CAPTULO 3.
}
/Mem:/ {
}
/-\/+/ {
}'
35
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:
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):
CAPTULO 3.
36
CAPTULO 3.
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:
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
CAPTULO 4.
APARNCIA TUDO...
39
4.2
O mtodo riptogr o
CAPTULO 4.
APARNCIA TUDO...
40
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:
CAPTULO 4.
APARNCIA TUDO...
41
4.3
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:
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
#!/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
CAPTULO 4.
APARNCIA TUDO...
44
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 --radiolist
1 "Opo 1"
2 "Opo 2"
3 "Opo 3"
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
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
mail. Com ele podemos mandar uma frase, ou todo um arquivo texto
om razovel
fa
ilidade:
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:
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:
#!/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:
5.2
s ript til!
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.
CAPTULO 5.
TRABALHANDO CONECTADO
51
HTML...
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:
Apndi
e A
Usando O editor de textos: VI
A.1
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
54
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
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
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!!!)
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...
: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
57
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:
B.1
B.1.1
ls - Listar arquivos
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:
59
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:
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.
B.1.4
60
p - Copia arquivos
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:
file nome_do_arquivo
E o
omando retorna o tipo de arquivo
om que estamos trabalhando.
B.1.6
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.
B.2
61
B.2.1
at - O texto na tela
head -5 arquivo
B.2.3
tail -7 arquivo
B.2.4
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 :
B.2.5
62
B.2.7
63
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 A-Z a-z
Lembre que a entrada do tr via pipe. Opes teis in
luem:
fold -w 40 arquivo
Bastante til no trabalho
om textos, anal, nun
a se sabe
om qual formato deles
hegam...
B.3
B.3.1
# ps ef
64
# 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:
free
125832
210980
265032
shared
0
buffers
8636
a
hed
76512
B.3.3
65
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:
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:
B.3.5
66
B.4
Alguns
omandos que no se enquadram nos des
ritos a
ima, mas so muito teis
mesmo assim:
B.4.1
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:
B.4.2
67
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 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
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:
de Programao em POSIX-Shell
68