Curso de Shell Script
Curso de Shell Script
Papo de Botequim
Você não agüenta mais aquele seu porque, em inglês, Shell significa con-
cha, carapaça, isto é, fica entre o u-
amigo usuário de Linux enchendo o suário e o sistema operacional, de
forma que tudo que interage com
seu saco com aquela história de que o o sistema operacional, tem que
passar pelo seu crivo.
sistema é fantástico e o Shell é uma
D
iálogo entreouvido em uma mesa O Linux, por definição, é um sistema
de um botequim, entre um multiusuário – não podemos nunca nos
usuário de Linux e um empur- esquecer disto – e para permitir o acesso
rador de mouse: O ambiente Linux de determinados usuários e barrar a en-
• Quem é o Bash? Para você entender o que é e como fun- trada de outros, existe um arquivo cha-
• É o filho caçula da família Shell. ciona o Shell, primeiro vou te mostrar mado /etc/passwd, que além de fornecer
• Pô cara! Estás a fim de me deixar como funciona o ambiente em camadas dados para esta função de “leão-de-chá-
maluco? Eu tinha uma dúvida e você do Linux. Dê uma olhada no gráfico cara” do Linux, também provê informa-
me deixa com duas! mostrado na Figura 1. ções para o início de uma sessão (ou
• Não, maluco você já é há muito tem- Neste gráfico podemos ver que a ca- “login”, para os íntimos) daqueles que
po: desde que decidiu usar aquele sis- mada de hardware é a mais profunda e é passaram por esta primeira barreira. O
tema operacional que você precisa formada pelos componentes físicos do último campo de seus registros informa
reiniciar dez vezes por dia e ainda por seu computador. Em torno dela, vem a ao sistema qual é o Shell que a pessoa
cima não tem domínio nenhum sobre camada do kernel que é o cerne do vai receber ao iniciar sua sessão.
o que esta acontecendo no seu com- Linux, seu núcleo, e é quem põe o hard- Lembra que eu te falei de Shell, fa-
putador. Mas deixa isso prá lá, pois ware para funcionar, fazendo seu geren- mília, irmão? Pois é, vamos começar a
vou te explicar o que é Shell e os com- ciamento e controle. Os programas e entender isto: o Shell é a conceituação
ponentes de sua família e ao final da comandos que envolvem o kernel, dele de concha envolvendo o sistema opera-
nossa conversa você dirá: “Meu Deus se utilizam para realizar as tarefas para cional propriamente dito, é o nome
do Shell! Porque eu não optei pelo que foram desenvolvidos. Fechando tudo genérico para tratar os filhos desta idéia
Linux antes?”. isso vem o Shell, que leva este nome que, ao longo dos muitos anos de exis-
maiores galhos. Seu nome é “pipe” (que $ echo "Existem who | wc -l U $ (pwd ; cd /etc ; pwd)
em inglês significa tubo, já que ele cana- usuarios conectados" /home/meudir
liza a saída de um comando para a Existem who | wc -l usuarios U /etc
entrada de outro) e sua representação é a conectados $ pwd
| (barra vertical). /home/meudir
Hi! Olha só, não funcionou! É mesmo,
$ ls | wc -l não funcionou e não foi por causa das “Quequeiiisso” minha gente? Eu estava
21 aspas que eu coloquei, mas sim por que no /home/meudir, mudei para o /etc,
eu teria que ter executado o who | wc -l constatei que estava neste diretório com
O comando ls passou a lista de arquivos antes do echo. Para resolver este proble- o pwd seguinte e quando o agrupamento
para o comando wc, que quando está ma, tenho que priorizar a segunda parte de comandos terminou, eu vi que conti-
com a opção -l conta a quantidade de li- do comando com o uso de crases: nuava no /etc/meudir!
nhas que recebeu. Desta forma, pode- Hi! Será que tem coisa do mágico
mos afirmar categoricamente que no $ echo "Existem `who | wc -l` U Mandrake por aí? Nada disso. O interes-
meu diretório existiam 21 arquivos. usuarios conectados" sante do uso de parênteses é que eles
Existem 8 usuarios U invocam um novo Shell para executar os
$ cat /etc/passwd | sort | lp conectados comandos que estão em seu interior.
Desta forma, fomos realmente para o
A linha de comandos acima manda a Para eliminar esse monte de brancos diretório /etc, porém após a execução de
listagem do arquivo /etc/passwd para a antes do 8 que o wc -l produziu, basta todos os comandos, o novo Shell que
entrada do comando sort. Este a classi- retirar as aspas. Assim: estava no diretório /etc morreu e retor-
fica e envia para o lp que é o gerenciador namos ao Shell anterior que estava em
da fila de impressão. $ echo Existem `who | wc -l` U /home/meudir.
usuarios conectados Que tal usar nossos novos conceitos?
Caracteres de ambiente Existem 8 usuarios conectados
Quando queremos priorizar uma expres- $ mail suporte@[Link] << FIM
são, nós a colocamos entre parênteses, As aspas protegem da interpretação do Ola suporte, hoje as `date U
não é? Pois é, por causa da aritmética é Shell tudo que está dentro dos seus lim- “+%hh:mm”` ocorreu novamente U
normal pensarmos deste jeito. Mas em ites. Como para o Shell basta um espaço aquele problema que eu havia U
Shell o que prioriza mesmo são as crases em branco como separador, o monte de reportado por telefone. De U
(`) e não os parênteses. Vou dar exemp- espaços será trocado por um único após acordo com seu pedido segue a U
los para você entender melhor. a retirada das aspas. listagem do diretorio:
Eu quero saber quantos usuários estão Outra coisa interessante é o uso do `ls -l`
“logados” no computador que eu admi- ponto-e-vírgula. Quando estiver no Shell, Abracos a todos.
nistro. Eu posso fazer: você deve sempre dar um comando em FIM
cada linha. Para agrupar comandos em
$ who | wc -l uma mesma linha, temos que separá-los Finalmente agora podemos demonstrar o
8 por ponto-e-vírgula. Então: que conversamos anteriormente sobre
“here document”. Os comandos entre
O comando who passa a lista de usuários $ pwd ; cd /etc; pwd ;cd -;pwd crases tem prioridade, portanto o Shell
conectados ao sistema para o comando /home/meudir os executará antes do redirecionamento
wc -l, que conta quantas linhas recebeu e /etc do “here document”. Quando o suporte
mostra a resposta na tela. Muito bem, /home/meudir receber a mensagem, verá que os
mas ao invés de ter um número oito comandos date e ls foram executados
solto na tela, o que eu quero mesmo é Neste exemplo, listei o nome do diretório antes do comando mail, recebendo então
que ele esteja no meio de uma frase. Ora, corrente com o comando pwd, mudei um instantâneo do ambiente no
para mandar frases para a tela eu só pre- para o diretório /etc, novamente listei o momento de envio do email.
ciso usar o comando echo; então vamos nome do diretório e finalmente voltei pa- - Garçom, passa a régua! ■
ver como é que fica: ra o diretório onde estava anteriormente
(cd -), listando seu nome. Repare que Julio Cezar Neves é Analista de Su-
SOBRE O AUTOR
Buraco Negro coloquei o ponto-e-vírgula de todas as porte de Sistemas desde 1969 e tra-
Em Unix existe um arquivo fantasma. formas possíveis, para mostrar que não balha com Unix desde 1980, quando
Chama-se /dev/[Link] que é enviado importa se existem espaços em branco fez parte da equipe que desenvolveu
para este arquivo some. Assemelha-se a um antes ou após este caracter. o SOX, sistema operacional, similar
Buraco Negro. No caso do exemplo, como ao Unix, da Cobra Computadores. É
Finalmente, vamos ver o caso dos
não me interessava guardar a possível men- professor do curso de Mestrado em
parênteses. No exemplo a seguir, colo-
sagem de erro oriunda do comando rm, redi- Software Livre das Faculdades Estácio
camos diversos comandos separados por
recionei-a para este arquivo. de Sá, no Rio de Janeiro.
ponto-e-vírgula entre parênteses:
para clarear de vez as diferenças de -l). Os apóstrofos foram usados para o Isto é, o nome do álbum será separado
uso entre os membros da família. Shell não “ver” o circunflexo. Vamos ver por um circunflexo do resto do registro,
Eu sei que em um arquivo qualquer mais um. Veja na Tabela 1 as quatro formado por diversos grupos compostos
existe um texto falando sobre Linux, só primeiras posições possíveis da saída de pelo intérprete de cada música do CD e a
não tenho certeza se está escrito com L um ls -l em um arquivo comum (não é música interpretada. Estes grupos são
maiúsculo ou minúsculo. Posso fazer diretório, nem link, nem …). separados entre si por dois pontos (:) e,
uma busca de duas formas: Para descobrir todos os arquivos exe- internamente, o intérprete será separado
cutáveis em um determinado diretório por um til (~) do nome da música.
egrep (Linux | linux) [Link] eu poderia fazer: Quero escrever um programa chamado
musinc, que incluirá registros no meu
ou então: $ ls -la | egrep ‘^-..(x|s)’ arquivo músicas. Passarei cada álbum
como parâmetro para o programa:
grep [Ll]inux [Link] novamente usamos o circunflexo para
limitar a pesquisa ao início de cada $ musinc “álbum^interprete~U
No primeiro caso, a expressão regular linha, ou seja, listamos as linhas que musica:interprete~musica:...”
complexa (Linux | linux) usa os parênte- começam por um traço (-), seguido de
ses para agrupar as opções e a barra ver- qualquer coisa (o ponto), novamente Desta forma, musinc estará recebendo os
tical (|) é usada como um “ou” (or, em seguido de qualquer coisa, e por fim um dados de cada álbum como se fosse uma
inglês) lógico, isto é, estou procurando x ou um s. Obteríamos o mesmo resul- variável. A única diferença entre um
Linux ou linux. tado se usássemos o comando: parâmetro recebido e uma variável é que
No segundo, a expressão regular os primeiros recebem nomes numéricos
[Ll]inux significa: começado por L ou l $ ls -la | grep ‘^-..[xs]’ (o que quis dizer é que seus nomes são
seguido de inux. Como esta é uma formados somente por um algarismo,
expressão simples, o grep consegue e além disso, agilizaríamos a pesquisa. isto é, $1, $2, $3, …, $9). Vamos, fazer
resolvê-la, por isso é melhor usar a mais alguns testes:
segunda forma, já que o egrep tornaria a A “CDteca”
pesquisa mais lenta. Vamos começar a desenvolver progra- $ cat teste
Outro exemplo. Para listar todos os mas! Creio que a montagem de um #!/bin/bash
subdiretórios do diretório corrente, basta banco de dados de músicas é bacana #Teste de passagem de parametros
usar o comando $ ls -l | grep ‘^d’. Veja o para efeito didático (e útil nestes tempos echo “1o. parm -> $1”
resultado no Quadro 1. de downloads de arquivos MP3 e echo “2o. parm -> $2”
No exemplo, o circunflexo (^) serviu queimadores de CDs). Não se esqueça echo “3o. parm -> $3”
para limitar a pesquisa à primeira que, da mesma forma que vamos desen-
posição da saída do ls longo (parâmetro volver um monte de programas para Agora vamos rodar esse programinha:
organizar os seus CDs de música, com
Tabela 1 pequenas adaptações você pode fazer o $ teste passando parametros para U
mesmo para organizar os CDs de soft- testar
Posição Valores possíveis
1ª -
ware que vêm com a Linux Magazine e bash: teste: cannot execute
2ª r ou -
outros que você compra ou queima, e
3ª w ou - disponibilizar esse banco de software Ops! Esqueci-me de tornar o script exe-
4ª x,s(suid) ou - para todos os que trabalham com você cutável. Vou fazer isso e testar nova-
(o Linux é multiusuário, e como tal deve mente o programa:
$ chmod 755 teste Execute o programa: inclusão de CDs no meu banco chamado
$ teste passando parametros para U musicas. O programa é muito simples
testar $ teste passando parametros para testar (como tudo em Shell). Veja a Listagem 1.
1o. parm -> passando O programa teste recebeu 4 U O script é simples e funcional; limito-
2o. parm -> parametros parametros me a anexar ao fim do arquivo musicas o
3o. parm -> para 1o. parm -> passando parâmetro recebido. Vamos cadastrar 3
2o. parm -> parametros álbuns para ver se funciona (para não
Repare que a palavra testar, que seria o 3o. parm -> para ficar “enchendo lingüiça,” suponho que
quarto parâmetro, não foi listada. Isso Para listar todos de uma U em cada CD só existem duas músicas):
ocorreu porque o programa teste só lista “tacada” eu faco passando U
os três primeiros parâmetros recebidos. parametros para testar $ musinc “album3^Artista5U
Vamos executá-lo de outra forma: ~Musica5:Artista6~Musica5”
Repare que antes das aspas usei uma $ musinc “album1^Artista1U
$ teste “passando parametros” U barra invertida, para escondê-las da ~Musica1:Artista2~Musica2”
para testar interpretação do Shell (se não usasse as $ musinc “album 2^Artista3U
1o. parm -> passando parametros contrabarras as aspas não apareceriam). ~Musica3:Artista4~Musica4”
2o. parm -> para Como disse, os parâmetros recebem
3o. parm -> testar números de 1 a 9, mas isso não significa Listando o conteúdo do arquivo musicas:
que não posso usar mais de nove
As aspas não deixaram o Shell ver o parâmetros. Significa que só posso $ cat musicas
espaço em branco entre as duas endereçar nove. Vamos testar isso: album3^Artista5~Musica5:Artista6U
primeiras palavras, e elas foram consid- ~Musica6
eradas como um único parâmetro. E $ cat teste album1^Artista1~Musica1:Artista2U
falando em passagem de parâmetros, #!/bin/bash ~Musica2
uma dica: veja na Tabela 2 algumas var- # Programa para testar passagem U album2^Artista3~Musica3:Artista4U
iáveis especiais. Vamos alterar o pro- de parametros (3a. Versao) ~Musica4
grama teste para usar as novas variáveis: echo O programa $0 recebeu $# U
parametros Podia ter ficado melhor. Os álbuns estão
$ cat teste echo “11o. parm -> $11” fora de ordem, dificultando a pesquisa.
#!/bin/bash shift Vamos alterar nosso script e depois testá-
# Programa para testar passagem U echo “2o. parm -> $1” lo novamente. Veja a listagem 2. Sim-
de parametros (2a. Versao) shift 2 plesmente inseri uma linha que classifica
echo O programa $0 recebeu $# U echo “4o. parm -> $1” o arquivo musicas, redirecionando a
parametros saída para ele mesmo (para isso serve a
echo “1o. parm -> $1” Execute o programa: opção -o), após cada álbum ser anexado.
echo “2o. parm -> $2”
echo “3o. parm -> $3” $ teste passando parametros para U $ cat musicas
echo Para listar todos de uma U testar album1^Artista1~Musica1:Artista2U
\”tacada\” eu faco $* O programa teste recebeu 4 U ~Musica2
parametros que são: albu2^Artista3~Musica3:Artista4U
Listagem 1: Incluindo CDs 11o. parm -> passando1 ~Musica4
na “CDTeca” 2o. parm -> parametros album3^Artista5~Musica5:Artista6U
4o. parm -> testar ~Musica6
$ cat musinc
#!/bin/bash Duas coisas muito interessantes aconte- Oba! Agora o programa está legal e
# Cadastra CDs (versao 1) ceram neste script. Para mostrar que os quase funcional. Ficará muito melhor em
# nomes dos parâmetros variam de $1 a $9 uma nova versão, que desenvolveremos
echo $1 >> musicas digitei echo $11 e o que aconteceu? O após aprender a adquirir os dados da tela
Shell interpretou como sendo $1 seguido e formatar a entrada.
do algarismo 1 e listou passando1;
Listagem 2 O comando shift, cuja sintaxe é shift n, Tabela 2: Variáveis especiais
podendo o n assumir qualquer valor
$ cat musinc Variável Significado
numérico, despreza os n primeiros
#!/bin/bash $0 Contém o nome do programa
parâmetros, tornando o parâmetro de
# Cadastra CDs (versao 2) $# Contém a quantidade de
ordem n+1. parâmetros passados
#
Bem, agora que você já sabe sobre $* Contém o conjunto de todos os
echo $1 >> musicas
passagem de parâmetros, vamos voltar à parâmetros (muito parecido com $@)
sort -o musicas musicas
nossa “cdteca” para fazer o script de
Analista de Suporte de
Listagem 4 ~Musica2
Sistemas desde 1969 e
muslist melhorado album3^Artista5~Musica5:Artista6U trabalha com Unix
~Musica6 desde 1980, quando
$ cat muslist
fez parte da equipe
#!/bin/bash
Conforme expliquei antes, o grep do que desenvolveu o
# Consulta CDs (versao 2) SOX, um sistema
exemplo listou todos os registros de
# operacional similar ao Unix, produzido
musicas exceto o referente a album 2, pela Cobra Computadores.
grep -i “$1” musicas
porque atendia ao argumento do co-
CursodeShellScript
Papode
botequimIII
Umchopinho,umaperitivoeopapocontinua.Destavezvamosaprender
algunscomandosdemanipulaçãodecadeiasdecaracteres,queserãomuito
úteisnahoradeincrementarnossa“CDteca”.PORJULIOCEZARNEVES
�����������������������������
[Link] Outubro2004 85
��������������������������������������������������������������������������������
���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������
LINUXUSER PapodeBotequim
Quadro1–Ocomandocut meiralinhaforaplicadoaorestantedo
arquivo, chegaremos à resposta ante-
posta a um exercício prático, valendo
nota, que passei ele me entregou um
riormentedada.Outrocomandomuito script com todos os comandos sepa-
Asintaxedocuté:cut-cPosIni-PosFim
interessanteéotrqueserveparasubs- rados por ponto-e-vírgula (lembre-se
[arquivo],ondePosIniéaposiçãoinicial,e
tituir,comprimirouremovercaracteres. queoponto-e-vírgulaserveparasepa-
PosFimaposiçãofinal.Vejaosexemplos:
Suasintaxesegueoseguintepadrão: rardiversoscomandosemumamesma
linha). Vou dar um exemplo simplifi-
$ ca e
[ ç e ] cadeia [cadeia ] cado,eidiota,deumscriptassim:
45 8
8 54
O comando copia o texto da entrada $ ca c f
4554
padrão(stdin),trocaasocorrênciados ech leia P g a açã Shell U
8 55 8
caracteres de cadeia1 pelo seu corres- Li d J li Ce a Ne e U
pondentenacadeia2outrocamúltiplas > li ca li d l U
$ c -c -5 e
ocorrências dos caracteres de cadeia1 -f li > de ll cd ~
45
por somente um caracter, ou ainda
8
caracteres da cadeia1. As principais Euexecuteioprogramaeelefuncionou:
45
opções do comando são mostradas na
8 5
Tabela1. $ c f
Primeirovejaumexemplobembobo: leia P g a açã Shell Li U
$ c -c- e
d J li Ce a Ne e
45
$ ech b b | a h e j e e LM
85
baba c f li e c ica
455
i c li e
8 55
Istoé,troqueitodasasocorrênciasda
letra o pela letra a. Suponha que em Masnotadeprovaécoisaséria(enota
$ c -c4- e
determinado ponto do meu script eu de dólar é mais ainda) então, para
45 8
peça ao operador para digitar s ou n entender o que o aluno havia feito, o
54
(sim ou não), e guardo sua resposta chameieemsuafrentedigitei:
4554
na variável $Resp. Ora, o conteúdo de
55 8
$Resp pode conter letras maiúsculas $ \ < c f
ouminúsculas,edestaformaeuteria ech leia P g a açã Shell U
$ c -c , ,5, , e
quefazerdiversostestesparasaberse Li d J li Ce a Ne e
5
arespostadadafoiS,s,Noun.Entãoo d
8 4
melhoréfazer: cd ~
54
l -l
5 8
$ Re =$ ech $Re | SN -f li > de ll
$ c -c - ,5,8- e
e após este comando eu teria certeza Ocaraficoumuitodesapontado,porque
58
de que o conteúdo de $Resp seria um em dois ou três segundos eu desfiz a
8
s ou um n. Se o meu arquivo ArqEnt gozaçãoqueeleperdeuhorasparafazer.
5
estátodoemletrasmaiúsculasedesejo Maspresteatenção!Seeuestivesseem
8 5 8
passá-lasparaminúsculaseufaço: umamáquinaUnix,euteriadigitado:
�����������������������������
86 Outubro2004 [Link]
��������������������������������������������������������������������������������
����������������������������������������������������
�����������������������������������������������������������������������������������������������������������������������������������������������������
PapodeBotequim LINUXUSER
�����������������������������
[Link] Outubro2004 87
��������������������������������������������������������������������������������
���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������
LINUXUSER PapodeBotequim
$ l ica Tabela2 de ll
ica Seqüência Significado Octal he
$ ech $ \t Tabulação \011 ech U a i \ $ \ já U
\n Novalinha \012 e i e
$ l A I e i e e <ENTER> el e
l : A I e i e e: N chU \v Tabulação \013 if e add $
file di ec Vertical he
$ ech $ \f Nova \014 ech U á i \ $ \ U
Página i cl íd e e c a d
$ h | g e j e e \r Inícioda \015 el e
j e e Se 8 U linha<^M> ech P ble a U
\\ Umabarra \0134
:4 4 44 cada a e V cê é
invertida
$ ech $ fi
fi
$ h | g e j lia a já e i e
$ ech $ el e Vamostestá-locomoumusuárionormal:
if e add $
he $ i c ZeNi g e
Oqueéqueesse$?fazaí?Algocome- ech U á i \ $ \ U i c [ ]: e add: f d
çadoporcifrão($)pareceserumavari- i cl íd e e c a d P ble a cada a e U
ável, certo? Sim é uma variável que el e V cê é
contémocódigoderetornodaúltima ech P ble a U
instrução executada. Posso te garan- cada a e V cê é Aquelamensagemdeerronãodeveria
tirqueseestainstruçãofoibemsuce- fi aparecer! Para evitar isso, devemos
dida,$?teráovalorzero,casocontrário fi redirecionarasaídadeerro(stderr)do
seuvalorserádiferentedezero.Oque comandouseraddpara/dev/null.Aver-
nosso comando condicional (if) faz é Repare que o if está testando direto o sãofinalficaassim:
testarestavariável.Entãovamosvera comandogrepeestaéasuafinalidade.
suasintaxe: Casooifsejabemsucedido,ouseja,o $ ca i c
usuário (cujo nome está em $1) foi ! bi ba h
if c d encontradoem/etc/passwd,oscoman- Ve ã
he dosdoblocodothenserãoexecutados if g e ^$ e c a d > U
c d (neste exemplo, apenas o echo). Caso de ll
c d contrário,asinstruçõesdoblocodoelse he
c d serão executadas, quando um novo if ech U a i \ $ \ já U
el e testa se o comando useradd foi execu- e i e
c d tadoacontento,criandooregistrodo el e
c d4 usuário em /etc/passwd, ou exibindo if e add $ > de ll
c d umamensagemdeerro,casocontrário. he
fi Executar o programa e passe como ech U á i \ $ \ U
parâmetroumusuáriojácadastrado: i cl íd e e c a d
Ouseja,casocomandocmdtenhasido el e
executado com sucesso, os comandos $ i c j e e ech P ble a U
doblocodothen(cmd1,cmd2ecmdn) j e e : :54 : :J li Ne e : U cada a e V cê é
serão executados, caso contrário, os h e j e e : bi U fi
comandos do bloco opcional do else ba h fi
(cmd3,cmd4ecmdm)serãoexecutados. U a i j e e ja e i e
Oblocodoiféterminandocomumfi. Depoisdisso,vejamosocomportamento
Vamosvernapráticacomoissofun- No exemplo dado, surgiu uma linha doprograma,seexecutadopeloroot:
ciona,usandoumscriptqueincluiusu- indesejada, ela é a saída do comando
áriosnoarquivo/etc/passwd: grep. Para evitar que isso aconteça, $ i c b elh
devemosdesviarasaídapara/dev/null. U á i b elh i cl id e U
$ ca i c Oprogramaficaassim: e c a d
! bi ba h
Ve ã $ ca i c Enovamente:
if g e ^$ e c a d ! bi ba h
he Ve ã $ i c b elh
ech U a i \ $ \ U if g e ^$ e c a d > U U á i b elh já e i e
�����������������������������
88 Outubro2004 [Link]
��������������������������������������������������������������������������������
����������������������������������������������������
�����������������������������������������������������������������������������������������������������������������������������������������������������
PapodeBotequim LINUXUSER
Lembra que eu falei que ao longo dos noiníciodacadeiaecifrão($)nofim, Como você viu, o programa melho-
nossos papos e chopes os nossos pro- servem para testar se o parâmetro (o rouumpouquinho,masaindanãoestá
gramas iriam se aprimorando? Então álbumeseusdados)éexatamenteigual pronto. À medida que eu te ensinar a
vejamosagoracomopodemosmelhorar a algum registro já existente. Vamos programaremshell,nossaCDtecavai
onossoprogramaparaincluirmúsicas executar nosso programa novamente, ficarcadavezmelhor.
na"CDTeca": masdestavezpassamoscomoparâme- –E ntendi tudo que você me explicou,
troumálbumjácadastrado,pravero mas ainda não sei como fazer um if
$ ca i c queacontece: para testar condições, ou seja o uso
! bi ba h normaldocomando.
Cada a CD e a $ i c alb 4^A i a ~ U –Para isso existe o comando test, que
M ica :A i a8~M ica8 testa condições. O comando if testa
if g e ^$ $ ica > U E e álb já e á cada ad o comando test. Como já falei muito,
de ll precisodeunschopesparamolhara
he Eagoraumnãocadastrado: palavra. Vamos parar por aqui e na
ech E e álb já e á U próxima vez te explico direitinho o
cada ad $ i c alb 5^A i a ~ U usodotestedediversasoutrassinta-
el e M ica :A i a ~M ica xesdoif.
ech $ >> ica $ ca ica –Falou! Acho bom mesmo porque eu
ica - ica alb ^A i a ~M ica : U também já tô ficando zonzo e assim
fi A i a ~M ica tenhotempoparapraticaressemonte
alb ^A i a ~M ica : U decoisasquevocêmefalouhoje.
Comovocêviu,éumapequenaevolu- A i a4~M ica4 Parafixaroquevocêaprendeu,tente
çãoemrelaçãoàversãoanterior.Antes alb ^A i a5~M ica5: U fazerumscriptizinhoparainformarse
de incluir um registro (que na versão A i a ~M ica5 um determinado usuário, cujo nome
anterior poderia ser duplicado), testa- alb 4^A i a ~M ica : U será passado como parâmetro, está
mosseoregistrocomeça(^)etermina A i a8~M ica8 “logado”nosistemaounão.
($) de forma idêntica ao parâmetro alb 5^A i a ~M ica : U –Aê Chico! traz mais dois chopes pra
álbum passado ($1). O circunflexo (^) A i a ~M ica mimporfavor… ■
�����������������������������
[Link] Outubro2004 89
��������������������������������������������������������������������������������
���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������
LINUXUSER PapodeBotequim
CursodeShellScript
Papode
botequimIV
Ogarçonjáperdeuacontadascervejas,eoassuntonãoacaba.Desta
DaveHamilton-[Link]
vezvamosaprenderatestarosmaisvariadostiposdecondições,
parapodermoscontrolaraexecuçãodenossoprogramadeacordo
comaentradafornecidapelousuário.PORJULIOCEZARNEVES
E aícara,tentoufazeroexercício
que te pedi em nosso último
encontro?
– Claro que sim! Em programação, se
você não treinar não aprende. Você
$ l gad j e e
j e e
: 4 44
j e e e á l gad
Oc 8 U
Ah,agorasim!Lembre-sedessapega-
dinha:amaiorpartedoscomandostem
umasaídapadrãoeumasaídadeerros
(o grep é uma das poucas exceções:
ele não exibe uma mensagem de erro
mepediuumscriptparainformarse Realmente funcionou. Passei meu quandonãoachaumacadeiadecarac-
umdeterminadousuário,cujonome nome de usuário como parâmetro e teres)edevemosredirecioná-lasparao
serápassadocomoparâmetroparao eledissequeeuestavalogado,porém buraconegroquandonecessário.
script,está“logado”(arghh!)ounão. ele imprimiu uma linha extra, que eu Bem,agoravamosmudardeassunto:
Fizoseguinte: não pedi, que é a saída do comando na última vez que nos encontramos
who. Para evitar que isso aconteça, é aquinobotequim,quandojáestávamos
$ ca l gad só mandá-la para o buraco negro do degoelaseca,vocêmeperguntoucomo
mundo UNIX, o /dev/null. Vejamos setestamcondições.Paraisso,usamos
! bi ba h entãocomoficaria: ocomandotest
Pe i a e á i e á
l gad ã $ ca l gad Testes
! bi ba h Todos estamos acostumados a usar o
if h | g e $ Pe i a e a e a e á if para testar condições, e estas são
he l gada ã e ã sempre maior que, menor que, maior
ech $ e á l gad if h | g e $ > de ll ouiguala,menorouiguala,igualae
el e he
ech $ ã e á edaç ech $ e á l gad Tabela1–Opçõesdo
fi el e testparaarquivos
ech $ ã e á edaç Opção Verdadeirose
– Calma rapaz! Já vi que você chegou fi -earq arqexiste
cheiodetesão.Primeirovamospedir -sarq arqexisteetemtamanhomaiorquezero
os nossos chopes de praxe e depois Agoravamosaostestes:
vamosaoShell.Chico,trazdoischo- -farq arqexisteeéumarquivoregular
pes,umsemcolarinho! $ l gad j e e -darq arqexisteeéumdiretório
-rarq arqexisteecomdireitodeleitura
– Aaah!Agoraquejámolhamososnos- j e e e á l gad
-warq arqexisteecomdireitodeescrita
sosbicos,vamosdarumaolhadanos $ l gad chic
-xarq arqexisteecomdireitodeexecução
resultadosdoseuprograma: chic ã e á edaç
�����������������������������
84 edição04 [Link]
��������������������������������������������������������������������������������
����������������������������������������������������
�����������������������������������������������������������������������������������������������������������������������������������������������������
PapodeBotequim LINUXUSER
Tabela2–Opçõesdotest No exemplo, testei a existência do cadeia de caracteres “01” é realmente
paracadeiasdecaracteres diretóriolmb.Senãoexistisse(else),ele diferente de “1”. Porém, a coisa muda
seriacriado.Jásei,vocêvaicriticara defiguraquandoasvariáveissãotesta-
Opção Verdadeirose:
minhalógicadizendoqueoscriptnão dasnumericamente,jáqueonúmero1
-zcadeia Tamanhodecadeiaézero
estáotimizado.Eusei,masqueriaque éigualaonúmero01.
-ncadeia Tamanhodecadeiaémaiorquezero
cadeia Acadeiacadeiatemtamanhomaiorquezero você o entendesse assim, para então Paramostrarousodosconectores-o
c1=c2 Cadeiac1ec2sãoidênticas poderusaro“ponto-de-espantação”(!) (ou)e-a(e),vejaumexemplo“animal”,
comoumnegadordotest.Vejasó: programadodiretonopromptdoBash.
Me desculpem os zoólogos, mas eu
diferente de. Para testar condições em if e ! -d l b nãoentendonadadereino,filo,classe,
ShellScriptusamosocomandotest,só he ordem,família,gênero,espécieeoutras
queeleémuitomaispoderosodoque kdi l b coisasdotipo,destaformaoqueestou
aquilo com que estamos acostuma- fi chamandodefamíliaoudegênerotem
dos. Primeiramente, veja na Tabela 1 cd l b grandechancedeestartotalecomple-
as principais opções (existem muitas tamenteincorreto:
outras) para testar arquivos em disco Desta forma o diretório lmb seria
enaTabela2asprincipaisopçõespara criado somente se ele ainda não exis- $ Fa ilia=feli ae
testedecadeiasdecaracteres. tisse,eestanegativadeve-seaoponto $ Ge e =ga
deexclamação(!)precedendoaopção $ if e $Fa ilia = ca idea U
Tabela3–Opçõesdo -d.Aofimdaexecuçãodessefragmento -a $Ge e = l b - $Fa ilia = U
testparanúmeros descript,comcertezaoprogramaesta- feli a -a $Ge e = leã
riadentrododiretóriolmb.Vamosver > he
Opção Verdadeirose Significado
doisexemplosparaentenderadiferença > ech C idad
n1-eqn2 n1en2sãoiguais equal
nacomparaçãoentrenúmeroseentre > el e
n1-nen2 n1en2nãosãoiguais notequal
cadeiasdecaracteres. > ech P de a a a ã
n1-gtn2 n1émaiorquen2 greaterthan
n1-gen2 n1émaiorouigualan2 greaterorequal > fi
n1-ltn2 n1émenorquen2 lessthan cad = P de a a a ã
n1-len2 n1émenorouigualan2 lessorequal cad =
if e $cad = $cad Neste exemplo, caso o animal fosse
he dafamíliacanídeae(-a)dogênerolobo,
Pensaqueacabou?Enganoseu!Agora ech A a iá ei ã ig ai ou(-o)dafamiliafelinae(-a)dogênero
éhoradealgomaisfamiliar,asfamosas el e leão,seriadadoumalerta,casocontrá-
comparações com valores numéricos. ech A a iá ei ã dife e e rioamensagemseriadeincentivo.
Veja a Tabela 3, e some às opções já fi Atenção: Os sinais de maior (>) no
apresentadasosoperadoresdaTabela4. início das linhas internas ao if são os
Ufa! Como você viu, tem coisa pra Executandoofragmentodeprograma prompts de continuação (que estão
chuchu,eonossoifémuitomaispode- acima,teremoscomoresultado: definidosnavariável$PS2).Quandoo
roso que o dos outros. Vamos ver em shell identifica que um comando con-
unsexemploscomoissotudofunciona. A a iá ei ã dife e e tinuará na linha seguinte, automatica-
Testamosaexistênciadeumdiretório: menteelecolocaestecaractere,atéque
Vamosagoraalterá-loumpoucopara ocomandosejaencerrado.
if e -d l b queacomparaçãosejanumérica: Vamosmudaroexemploparaverseo
he programacontinuafuncionando:
cd l b cad =
el e cad = $ Fa ilia=feli
kdi l b if e $cad -e $cad $ Ge e =ga
cd l b he $ if e $Fa ilia = feli - U
fi ech A a iá ei ã ig ai $Fa ilia = ca ide -a $Ge e = U
el e ça - $Ge e = l b
Tabela4 ech A a iá ei ã dife e e > he
fi > ech C idad
Operador Finalidade > el e
Parênteses() 0
Evamosexecutá-lonovamente: > ech P de a a a ã
> fi
Exclamação! 0
A a iá ei ã ig ai C idad
-a 0
-o 0
Comovocêviu,nasduasexecuções Obviamente a operação resultou em
obtive resultados diferentes, porque a erro,porqueaopção-atemprecedência
�����������������������������
[Link] edição04 85
��������������������������������������������������������������������������������
���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������
LINUXUSER PapodeBotequim
�����������������������������
86 edição04 [Link]
��������������������������������������������������������������������������������
����������������������������������������������������
�����������������������������������������������������������������������������������������������������������������������������������������������������
PapodeBotequim LINUXUSER
�����������������������������
[Link] edição04 87
��������������������������������������������������������������������������������
���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������
LINUXUSER PapodeBotequim
Quadro1-Script ca e $ c i Ocomandodateinformaadatacom-
bem-educado i cl a pletadosistemaetemdiversasopções
e cl a de mascaramento do resultado. Neste
! bi ba h
al e aca comando, a formatação começa com
P g a a be ed cad e
4 e i umsinaldemais(+)eoscaracteresde
dá b -dia, b a- a de
* ech Digi e a çã U formataçãovêmapósumsinaldeper-
b a- i e c f e a h a
e e e 4 centagem(%),assimo%Hsignificaa
H a=$ da e H
e ac horadosistema.Ditoisso,vejaoexem-
ca e $H a i
plonoQuadro1.
| [ ] ech B Dia
Como você deve ter percebido, eu Pegueipesado,né?Quenada,vamos
useioasteriscocomoúltimaopção,isto esmiuçararesolução:
[ - ] ech B a Ta de
é,seoasteriscoatendeaqualquercoisa,
então servirá para qualquer coisa que 0?|1 [01]– Zeroseguidodequalquer
* ech B a N i e
nãoestejanointervalode1a4.Outra coisa (?), ou (|) um seguido de zero
coisaasernotadaéqueoduploponto-e- ouum([01]),ouseja,estalinha"casa"
e ac
vírgulanãoénecessárioantesdoesac. com01,02,...09,10e11;
e i
Vamos agora fazer um script mais 1 [2-7]– Significaumseguidodalista
radical.Eletedarábomdia,boatarde decaracteresentredoisesete,ouseja,
Neste exemplo você viu o uso do ou boa noite dependendo da hora em estalinhapega12,13,...17;
comando elif como um substituto ou queforexecutado,masprimeiramente *– Significatudooquenãocasoucom
formamaiscurtadeelseif.Essaéuma vejaestescomandos: nenhumdospadrõesanteriores.
sintaxeválidaeaceita,maspoderíamos
fazeraindamelhor.Paraissousamoso $ da e – Cara, até agora eu falei muito e bebi
comandocase,cujasintaxemostramos T e N : : BRST 4 pouco. Agora eu vou te passar um
aseguir: $ da e H exercício para você fazer em casa e
medararespostadapróximavezem
ca e $ a i que nos encontrarmos aqui no bote-
ad a c d quim,tálegal?
c d – Beleza!
c d – É o seguinte: faça um programa que
ad a c d receba como parâmetro o nome de
c d umarquivoequequandoexecutado
c d salveessearquivocomonomeorigi-
ad a c d nalseguidodeumtil(~)eabraesse
c d arquivodentrodoviparasereditado.
c d Isso é para ter sempre uma cópia
e ac de backup do arquivo caso alguém
faça alterações indevidas. Obvia-
Ondeavariável$varécomparadaaos mente, você fará as críticas neces-
padrõespadrao1,...,padraon.Casoum sárias,comoverificarsefoipassado
dospadrõescorrespondaàvariável,o umparâmetro,seoarquivoindicado
blocodecomandoscmd1,...,cmdncor- existe...Enfim,oquetedernatelhae
respondenteéexecutadoatéencontrar vocêacharquedevaconstardoscript.
umduploponto-e-vírgula(;;),quando Deupraentender?
ofluxodoprogramaseráinterrompido – Hum,hum...
e desviado para instrução imediata- – Chico,trazmaisum,semcolarinho!■
menteapósocomandoesac(que,caso
nãotenhamnotado,écaseaocontrário. JulioCezarNevesé
Eleindicaofimdoblocodecódigo,da AnalistadeSuporte
deSistemasdesde
SOBREOAUTOR
mesmaformaqueotcomandofiindica
1969etrabalhacom
ofimdeumif). Unixdesde1980,
Naformaçãodospadrões,sãoaceitos quandoparticipou
oscaracteresmostradosnaTabela6. dodesenvolvimento
Para mostrar como o código fica doSOX,umsistema
operacionalsimilaraoUnixpro-
melhor,vamosrepetiroexemploante-
duzidopelaCobracomputadores.
rior,sóquedestavezusaremosocase Podesercontatadonoe-mailjulio.
emvezdotradicionalblocodecódigo neves@[Link]
comif...elif...else...fi.
�����������������������������
88 edição04 [Link]
��������������������������������������������������������������������������������
����������������������������������������������������
�����������������������������������������������������������������������������������������������������������������������������������������������������
PapodeBotequim LINUXUSER
CursodeShellScript
Papode
BotequimV
Blocosdecódigoelaços(ouloops,comopreferemalguns)
DaveHamilton-[Link]
sãootemadomêsemmaisumaliçãodenossocursodeShell
Script.Garçom,saltaumaboaredondinha,quetôafimde
refrescaropensamento!PORJULIOCEZARNEVES
F
–
ala cara! E as idéias estão em
ordem?Jáfundiuacucaouvocê
aindaagüentamaisShell?
Güento! Tô gostando muito! Gostei
tanto que até caprichei no exercício
Atéagorajávimosalgunsblocosde
código, como quando te mostrei um
exemploparafazerumcdparadentro
deumdiretório:
$ ca
! bi
Quadro1:[Link]
i a h
ba h
�����������������������������
[Link] edição05 89
��������������������������������������������������������������������������������
���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������
LINUXUSER PapodeBotequim
c d comigomesmo!” 09 <TAB>
c d Oblocodecomandosaserexecutado 20 <ESPAÇO>
fei erasomenteoecho,quecomaopção-n 0a <ENTER>
listouavariável$Arqseguidadedois-
Ondeavariávelvarassumecadaum pontos(:),semsaltaralinha.Ocifrão
dosvaloresdalistaval1val2...valne, ($) do final da linha da execução é o O último 0a foi proveniente do
paracadaumdessesvalores,executao prompt, que permaneceu na mesma <ENTER> dado ao final do comando.
blocodecomandosformadoporcmd1, linhatambémemfunçãodaopção-n. Paramelhoraraexplicação,vamosver
cmd2 e cmdn. Agora que já vimos o Outroexemplosimples(porenquanto): issodeoutraforma:
significadodainstruçãoemportuguês,
vejamosasintaxecorreta: $ ca e ef $ ech :$IFS: | ca - e
! bi ba h : ^I$
f a i al al al P g a a didá ic a a :$
d e e de f
c d f Pala a i Li Maga i e U No comando cat, a opção -e repre-
c d d B a il sentao<ENTER>comoumcifrão($)
c d d eaopção-trepresentao<TAB>como
d e ech $Pala a um^I.Useiosdois-pontos(:)paramos-
d e trar o início e o fim do echo. E dessa
Vamos aos exemplos, para entender forma,pudemosnotarqueostrêscarac-
direitoofuncionamentodestecomando. Eexecutandotemos: teresestãopresentesnaquelavariável.
Vamos escrever um script para listar Agoravejavocê:traduzindo,IFSsig-
todososarquivosdodiretório,separa- $ e ef nificaseparadorentrecampos.Umavez
dospordois-pontos,masantesvejaisso: Li entendidoisso,eupossoafirmarqueo
Maga i e comandofornãousaapenaslistassepa-
$ ech * d radasporespaçosembranco,massim
A D DOS c f i c B a il pelo conteúdo da variável $IFS, cujo
l gad e c ica i c valorpadrãosãooscaracteresqueaca-
li Como você viu, esse exemplo é bamosdever.Paracomprovarmosisso,
tão bobo e simples como o anterior, vamos continuar mexendo em nossa
Isto é, o Shell viu o asterisco (*), mas serve para mostrar o comporta- CDTeca, escrevendo um script que
expandiu-o com o nome de todos os mentobásicodofor.Vejasóaforçado recebeonomedoartistacomoparâme-
arquivosdodiretórioeocomandoecho comando: ainda estamos na primeira troelistaasmúsicasqueeletoca.Mas
jogou-osparaatelaseparadosporespa- possibilidadedesintaxeejáestoumos- primeiramentevamosvercomoestáo
çosembranco.Vistoisso,vamosresol- trandonovasformasdeusá-lo.Láatrás nossoarquivomusicas:
veroproblemaaquenospropusemos: eu havia falado que o for usava listas
separadasporespaçosembranco,mas $ ca ica
$ ca e ef issoéumameia-verdade,sóparafacili- alb ^A i a ~M ica : U
! bi ba h taracompreensão.Naverdade,aslistas A i a ~M ica
P g a a didá ic a a nãosãoobrigatoriamenteseparadaspor alb ^A i a ~M ica : U
e e de f espaços.Masantesdeprosseguir,pre- A i a4~M ica4
f A i * cisotemostrarcomosecomportauma alb ^A i a5~M ica5: U
d variáveldosistemachamadadeIFS,ou A i a ~M ica
ech - $A : InterFieldSeparatorVejanoexemploa alb 4^A i a ~M ica : U
d e seguirseuconteúdo: A i a ~M ica
�����������������������������
90 edição05 [Link]
��������������������������������������������������������������������������������
����������������������������������������������������
�����������������������������������������������������������������������������������������������������������������������������������������������������
PapodeBotequim LINUXUSER
�����������������������������
[Link] edição05 91
��������������������������������������������������������������������������������
���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������
LINUXUSER PapodeBotequim
tado.Aindausandooforcomseq: SuportedeSistemasdesde1969etra-
f i<= balhacomUnixdesde1980,quando
f i i $ e 4 d participoudodesenvolvimentodo
d le i SOX,umsistemaoperacionalsimilar
ech - $i ech - $i aoUnixproduzidopelaCobraCom-
putadores.Podesercontatadono
d e d e
e-mail[Link]@[Link]
4 5 8 4 5 8
�����������������������������
92 edição05 [Link]
��������������������������������������������������������������������������������
���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������
LINUXUSER PapodeBotequim
Curs��eShellS�ript
Papode
BotequimVI
Blocosdecódigoelaços(ouloops,comopreferemalguns)
DaveHamilt��-[Link]�.hu
sãootemadomêsemmaisumaliçãodenossocursodeShell
Script.Garçom,saltaumaboaredondinha,quetôafimde
refrescaropensamento!PORJ�LIOCEZARNEVES
F ala,cara!Eaí,játásabendotudo
docomandofor?Eutedeixeium
exercícioparatreinar,senãome
enganoeraparacontaraquantidadede
palavrasdeumarquivo...Vocêfez?
Ou seja, o programa começa, como
sempre, verificando se a passagem de
parâmetros foi correta; em seguida o
comandoforseincumbedepegarcada
umadaspalavras(lembre-sequeo$IFS
Umavezquechegamosnesteponto,
creioserinteressantecitarqueoShell
trabalhacomoconceitode“Expansão
Aritmética” (Arithmetic Expansion),
queéacionadaporumaconstruçãoda
– Claro! Tô empolgadão com essa lin- padrãoébranco,TABeENTER,queé forma$((expressão))ouletexpressão.
guagem! Eu fiz da forma que você exatamenteoquedesejamosparasepa- No último loop for usei a expansão
pediu,olhasó... raraspalavras),incrementandoavari- aritmética das duas formas, mas não
– Êpa! Peraí que eu tô sequinho pra ável$Cont.Vamosrelembrarcomoéo podemosseguiradiantesemsaberque
tomarumchope.AêChico,trazdois arquivo[Link]. aexpressãopodeserumadaslistadas
porfavor.Umsemcolarinho! natabela1.
– Comoeuiadizendo,olhacomoeufiz. $ ca A D DOS Masvocêpensaqueopapodeloop
Émuitofácil... E e a i (ou laço) se encerra no comando for?
f i ge ad el Ledoengano,amigo,vamosapartirde
$ ca c al h DOS R i e f i agoravermaisdoiscomandos.
! bi ba h bai ad
Sc i e a e e edag gic f al fei O��ma���while
c ja f çã é c a a Todososprogramadoresconhecemeste
a idade de ala a de Agora vamos testar o programa pas- comando,porqueécomumatodasas
a i S e- e e a sandoessearquivocomoparâmetro: linguagens.Nelas,oquenormalmente
ala a e ã e a ada ocorreéqueumblocodecomandosé
e e i e aç , <TAB> $ c al h A D DOS executado, enquanto (enquanto, em
<ENTER> O a i A D DOS e 4 inglês, é “while”) uma determinada
if [ $ - e ] ala a condiçãoforverdadeira.
he
ech : $ ca i h d U Funcionou legal! Tabela1:Expressões��Shell
a i Se você se lembra, Expressã� Resulta��
e i em nossa última id++id-- pós-incrementoepós-decrementodevariáveis
fi aula mostramos o ++id--id pré-incrementoepré-decrementodevariáveis
C = loopforaseguir: ** exponenciação
f Pala a i $ ca $ */% multiplicação,divisão,restodadivisão(módulo)
d f i<= +- adição,subtração
C =$ C d <=>=<> comparação
==!= igualdade,desigualdade
d e le i
&& Elógico
ech O a i $ e $C U ech - $i
|| OUlógico
ala a d e
�����������������������������
86 edição06 [Link]
��������������������������������������������������������������������������������
����������������������������������������������������
�����������������������������������������������������������������������������������������������������������������������������������������������������
PapodeBotequim LINUXUSER
Poisbem,issoéoqueacontecenas $ l ga e h $ca bg h
linguagens caretas! Em programação efe Ja 4 8:4 U ! bi ba h
Shell,oblocodecomandoséexecutado 4 44 E ec a e i a
enquanto um comando for verdadeiro. efe Ja 4 8:4 U ce e backg d
E é claro, se quiser testar uma condi- 4 44 $ & C l ca e backg d
ção,useocomandowhilejuntocomo hile | g e - $!
comando test, exatamente como você efe Ja 4 8:4 U d
aprendeuafazernoif,lembra?Entãoa 4 44 lee 5
sintaxedocomandoficaassim: d e
Istoé,acada30segundosasaídado ech Fi d P ce $
hile c a d comandogrepseriaenviadaparaatela,
d oquenãoélegal,jáquepoluiriaatela Essescriptébastantesimilaraoante-
c d domeumicroeamensagemtãoespe- rior,mastemunsmacetesamais,veja
c d radapoderiapassardespercebida.Para só:eletemqueserexecutadoemback-
evitarisso,jásabemosqueasaídado groundparanãoprenderopromptmas
c d pipelinetemqueserredirecionadapara o$!seráodoprogramapassadocomo
d e odispositivo/dev/null. parâmetro, já que ele foi colocado em
background após o [Link] propria-
e dessa forma, o bloco formado pelas $ ca l ga e h mentedito.Reparetambémnaopção-q
instruçõescmd1,cmd2,...ecmdnéexe- ! bi ba h (quiet)dogrep,queserveparafazê-lo
cutadoenquantoaexecuçãodainstru- E e e a X a ã e ha “trabalharemsilêncio”.Omesmoresul-
çãocomandoforbemsucedida. c igh de efe e a : tado poderia ser obtido com a linha:
Suponha a seguinte cena: tinha hile h | g e efe > de ll whileps|grep$!>/dev/null,comonos
uma tremenda gata me esperando e d exemplosquevimosatéagora.
euestavapresonotrabalhosempoder lee Vamos melhorar o nosso velho
sairporqueomeuchefe,queéumpé d e musinc,nossoprogramaparaincluir
nosaco(aliáschefe-chatoéumaredun- ech O a e a d , ã U registros no arquivo musicas, mas
dância,né?),aindaestavanasaladele, he i e, dê e i e á a l a antes preciso te ensinar a pegar
queficabemnaminhapassagemparaa umdadodatela,ejávouavisando:
rua.Elecomeçouaficarcabreirodepois Agora quero montar um script que só vou dar uma pequena dica do
daquintavezquepasseipelasuaporta receba o nome (e eventuais parâme- comando read (que é quem pega o
eolheiparaversejáhaviaidoembora. tros)deumprogramaqueseráexecu- dado da tela), que seja o suficiente
Entãovolteiparaaminhamesaefiz,no tadoembackgroundequemeinforme para resolver este nosso problema.
servidor,umscriptassim: doseutérmino.Mas,paravocêenten- Emumaoutrarodadadechopevou
der este exemplo, primeiro tenho de te ensinar tudo sobre o assunto,
$ ca l ga e h mostrarumanovavariáveldosistema. inclusive como formatar tela, mas
! bi ba h Vejaestescomandosexecutadosdireta- hojeestamosfalandosobreloops.A
E e e a X a ã e ha mentenoprompt: sintaxe do comando read que nos
c igh de efe e a : interessaporhojeéaseguinte:
hile h | g e efe $ lee &
d [ ] $ ead - de lei a a
lee $ ech $!
d e Onde “prompt de leitura” é o texto
ech O a e a d , ã U [ ] D e lee que você quer que apareça escrito na
he i e, dê e i e á à l a $ ech $! tela.Quandoooperadorteclartaldado,
ele será armazenado na variável var.
Neste scriptzinho, o comando while Porexemplo:
testaopipelinecompostopeloscoman- Isto é, criei um processo em back-
dos who e grep, que será verdadeiro ground que dorme por 10 segundos, $ ead - Tí l d Álb : Ti
enquanto o grep localizar a palavra somenteparamostrarqueavariável$!
xefe na saída do comando who. Desta guardaoPID(ProcessID)doúltimopro- Bem,umavezentendidoisso,vamos
forma,oscriptdormirápor30segundos cesso em background. Mas observe a à especificação do nosso problema:
enquantoochefeestiverlogado(Argh!). listagemerepare,apósalinhadoDone, faremosumprogramaqueinicialmente
Assimqueelesedesconectardoservi- que a variável reteve o valor mesmo leráonomedoálbumeemseguidafará
dor,ofluxodoscriptsairádoloopete apósotérminodesseprocesso. umloopdeleitura,pegandoonomeda
mostrará a tão ansiada mensagem de Bem,sabendoisso,jáficamaisfácil música e o artista. Esse loop termina
liberdade.Masquandoexecuteioscript, monitorar qualquer processo em back- quandoforinformadaumamúsicacom
adivinhaoqueaconteceu? ground.Vejasócomo: nomevazio,istoé,quandoooperador
�����������������������������
[Link] edição06 87
��������������������������������������������������������������������������������
���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������
LINUXUSER PapodeBotequim
O��ma���until A =
hile e
Este comando funciona de forma
d
idêntica ao while, porém ao contrário.
ech Dad da ilha $C :
Disse tudo mas não disse nada, né? É
ead - M ica: M
o seguinte: ambos testam comandos;
[ $M ] || b eak Sai e a i
ambos possuem a mesma sintaxe e
ead - A i a: $ A A
ambosatuamemloop;porém,owhile
[ $A ] && A = $A Se a i A a e i
executaoblocodeinstruçõesdoloop
Reg= $Reg$ A ~$M : M a d egi
enquanto um comando for bem suce-
C =$ C
dido;jáountilexecutaoblocodoloop
A li ha a e i b de ia e C
atéqueocomandosejabemsucedido.
d e
Parecepoucacoisa,masadiferençaé
ech $Reg >> ica
fundamental.Asintaxedocomandoé
ica - ica
praticamenteamesmadowhile.Veja:
�����������������������������
88 edição06 [Link]
��������������������������������������������������������������������������������
����������������������������������������������������
�����������������������������������������������������������������������������������������������������������������������������������������������������
PapodeBotequim LINUXUSER
E à : h
Atalh�s��
l��p �� ��
Pa a=
etambém:
il [ $Pa a ]
d
c i e [ d l ]
clea
ead - Tí l d Álb : Ti
Onde qtd loop representa a quanti-
if [ ! $Ti ] Se i l a i
dadedosloopsmaisinternossobreos
he
quaisoscomandosirãoatuar.Seuvalor
Pa a= Lig ei flag de aída
pordefaulté1.
el e
Duvido que você nunca tenha apa-
if g e ^$Ti \^ ica > de ll
gado um arquivo e logo após deu um
he
tabefe na testa se xingando porque
ech E e álb já e á cada ad
não devia tê-lo removido. Pois é, na
e i
décimavezquefizestabesteira,criei
fi
um script para simular uma lixeira,
Reg= $Ti ^
istoé,quandomandoremoverum(ou
C =
vários) arquivo(s), o programa “finge”
A =
quedeletou,masnodurooqueelefez
hile [ $Ti ]
foimandá-lo(s)paraodiretório/tmp/
d
LoginName_do_usuario. Chamei esse
ech Dad da ilha $C :
programadeerreemeenoarquivo/etc/
ead - M ica: M
profile coloquei a seguinte linha, que
[ $M ] || b eak Sai e a i
criaum“apelido”paraele:
ead - A i a: $ A A
[ $A ] && A = $A Se a i A a e i
alia =e ee e
Reg= $Reg$ A ~$M : M a d egi
C =$ C
Vejaoprogramanalistagem3.Como
A li ha a e i b de ia e C
vocêpodever,amaiorpartedoscript
d e
é formada por pequenas críticas aos
ech $Reg >> ica
parâmetros informados, mas como o
ica - ica
scriptpodeterrecebidodiversosarqui-
fi
vosaremover,acadaarquivoquenão
d e
se encaixa dentro do especificado há
�����������������������������
[Link] edição06 89
��������������������������������������������������������������������������������
���������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������
LINUXUSER PapodeBotequim
Listagem3:[Link]
$ ca e ee e h he
! bi ba h ech $A a e i e
E =
Sal a d c ia de a i a e de e ê-l c i e V l a a a c a d f
fi
Te de e ai a i a e e
if [ $ -e ] C d di a e i f a e d di de $A
he Di O ig=`di a e $A `
ech E -> U : e ee e a [a ] [a ] Ve ifica e i ã de g a aca di e i
ech O de e aca ac e e e e i id E U if [ ! - $Di O ig ]
e ee e a * he
e i ech Se e i ã di e i de $A
fi E =4
c i e V l a a a c a d f
Va iá el d i e a e c é e d á i fi
Me Di = $LOGNAME
Se ã e i i e di e i b Se e e a ia d a li ei a
if [ ! -d $Me Di ] if [ $Di O ig = $Me Di ]
he he
kdi $Me Di V c iá-l ech $A fica a e c ia de eg a ca
fi -i $A Pe g a a e de e e
Se á e á i e e
Se ã g a a di e i [ -f $A ] || ech $A i e id
if [ ! - $Me Di ] c i e
he fi
ech I i el al a a i e $Me Di U
M de a e i e G a d fi d a i e di e i igi alU
e i a a á-l e c i de dele e
fi cd $Di O ig
d >> $A
Va iá el e i dica c d de e d g a a $A $Me Di Sal e e
E = ech $A e id
U f e i ecebe a a e a ad d e
f A
d Pa e e al e d e a a c dig
Se e e a i ã e i i de e
if [ ! -f $A ] e i $E
umcontinue,paraqueaseqüênciavolte faça-o em casa e me traga para dis- um email para [Link]@gmail.
para o loop do for de forma a receber cutirmosnonossopróximoencontro com.Agorachegadepapoqueeujá
outrosarquivos. aquinoboteco. estoudegoelasecadetantofalar.Me
QuandovocêestánoWindows(com – Poxa,masnesseeuachoquevoudan- acompanhanopróximochopeoujá
perdãodamápalavra)etentaremover çar,poisnãoseinemcomocomeçar... vaisaircorrendoparafazeroscript
aquelemontedelixocomnomesesqui- – C ara, este programa é como tudo quepassei?
sitos como [Link], se der erro o que se faz em Shell: extrema- – Deixaeupensarumpouco...
emumdosarquivososoutrosnãosão mente fácil. É para ser feito em, no – Chico,trazmaisumchopeenquanto
removidos,nãoé?Então,ocontinuefoi máximo, 10 linhas. Não se esqueça elepensa!
usado para evitar que uma improprie- dequeoarquivoestásalvoem/tmp/
dadedessasocorra,istoé,mesmoque $LOGNAMEequesuaúltimalinhaé JulioCezarNeveséAnalistade
SOBREOAUTOR
dê erro na remoção de um arquivo, o o diretório em que ele residia antes SuportedeSistemasdesde1969etra-
programa continuará removendo os de ser “removido”. Também não se balhacomUnixdesde1980,quando
outrosqueforampassados. esqueça de criticar se foi passado o participoudodesenvolvimentodo
– Eu acho que a esta altura você deve nomedoarquivoaserremovido. SOX,umsistemaoperacionalsimilar
estar curioso para ver o programa – Éeuvoutentar,masseinão... aoUnixproduzidopelaCobraCom-
putadores.Podesercontatadono
querestauraoarquivoremovido,não – Tenhafé,irmão,eutôtefalandoque
e-mail[Link]@[Link]
é? Pois então aí vai vai um desafio: émole!Qualquerdúvidaésópassar
�����������������������������
90 edição06 [Link]
��������������������������������������������������������������������������������
LinuxUser Papodebotequim
PapodeBotequim
Curso de Shell Script
ParteVII
C
umequié,rapaz!Derreteuospen- –Peraí,deixaeuverseentendioquevocê –É,tôvendoqueobichinhodoshellte
samentosparafazeroscriptzinho fez:vocêcolocanavariávelDi aúltima pegou.Vamosvercomolerdados,mas
queeutepedi? linhadoarquivoaserrestaurado,em antesvoutemostrarumcomandoque
–É ,eurealmentetivedecolocarmuita nossocaso $LOGNAME $ (onde tedátodasasferramentasparaformatar
pensaçãonatelapreta,masachoque $LOGNAMEéonomedousuáriologado, umateladeentradadedados.
finalmenteconsegui!Bem,pelomenos e $ éoprimeiroparâmetroquevocê
nostestesquefizacoisafuncionou, passouaoscript),jáquefoiláquearma- O comando tput
masvocêtemsemprequebotarchifres zenamosonomeecaminhooriginaisdo Oprincipalusodessecomandoéoposi-
emcabeçadecachorro! arquivoantesdemovê-loparaodiretório cionamentodocursornatela.Alguns
–Nãoébemassim.Équeprogramarem (definidonavariávelDi ).Ocomando parâmetrospodemnãofuncionarseo
ShellScriptémuitofácil,masoqueé g e - apagaessalinha,restaurando modelodeterminaldefinidopelavari-
realmenteimportantesãoasdicase oarquivoaoestadooriginal,eomanda áveldeambiente$TERMnãosuportá-los.
macetesquenãosãotriviais.Ascor- devoltapraondeeleveio.Aúltimalinha Atabela 1apresentaapenasosprincipais
reçõesquefaçosãojustamentepara oapagada“lixeira”.Sensacional!Impe- parâmetroseosefeitosresultantes,mas
mostrá-los.Masvamospedirdoischo- cável!Nenhumerro!Viu?Vocêjáestá existemmuitomaisdeles.Parasabertudo
pesenquantodouumaolhadelanoteu pegandoasmanhasdoshell! sobreotput,vejaareferência[1].
scriptlánalistagem 1.AêChico,traz –E ntãovamoslá,chegadelesco-lesco Vamosfazerumprogramabembesta
doischopes!Enãoseesqueçaqueum eblá-blá-blá,sobreoquênósvamos efácilparailustrarmelhorousodesse
delesésemcolarinho! falarhoje? comando.Éumaversãodofamigerado
“AlôMundo”,sóquedessavezafrase
Listagem 1 – [Link] seráescritanocentrodatelaeemvídeo
reverso.Depoisdisso,ocursorvoltarápara
! bi ba h
aposiçãooriginal.Vejaalistagem 2.
Comooprogramajáestátodocomen-
Re a a a i dele ad ia e ee e
tado,achoqueaúnicalinhaqueprecisade
4
explicaçãoéa8,ondecriamosavariável
5
C l a.Oestranhoaliéaquelenúmero
if [ $ -e ]
9,quenaverdadeindicaotamanhoda
he
cadeiadecaracteresquevouescreverna
8 ech U : $ <N e d a i a e e a ad >
tela.Dessaforma,esteprogramasomente
e i
conseguiriacentralizarcadeiasde9carac-
fi
teres,masvejaisto:
Pega e d a i di e i igi al a l i a li ha
Di = ail - $LOGNAME $
$ a =Pa
O g e - e cl i a l i a li ha e ec ia a i c di e i
$ ech ${ a }
4 e e igi al e e ad
4
5 g e - $Di $LOGNAME $ > $Di $
$ a = Pa de B e i
Re e a i e já e a a ib d
$ ech ${ a }
$LOGNAME $
86 abril2005 edição07
[Link]
LinuxUser Papodebotequim
88 abril2005 edição07
[Link]
Papodebotequim LinuxUser
abril2005 edição07 89
[Link]
LinuxUser Papodebotequim
90 abril2005 edição07
[Link]
Papodebotequim LinuxUser
abril2005 edição07 91
[Link]
LinuxUser Papodebotequim
PapodeBotequim
Curso de Shell Script
ParteVIII
E
aê,cara,tudobem? posicionais($ , $ , …, $ ).Todasasregrasqueseaplicam
– –Tudobeleza!Euqueriatemostraroquefizmasjásei àpassagemdeparâmetrosparaprogramastambémvalempara
quevocêvaiquerermolharobicoprimeiro,né? funções,masémuitoimportanterealçarqueosparâmetros
– Sópratecontrariar,hojenãoquero.Vai,mostralogoaí passadosparaumprogramanãoseconfundemcomaqueles
oquevocêfez. quesãopassadosparasuasfunções.Issosignifica,porexem-
–Poxa,oexercícioquevocêpassouémuitogrande.Dáuma plo,queo $ deumscriptédiferentedo $ deumadesuas
olhadanalistagem 1evêcomoeuresolvi: funçõesinternas.
– É,oprogramatálegal,tátodoestruturadinho,masgosta- Reparequeasvariáveis $M g, $Ta M ge $C lsãodeuso
riadefazeralgunspoucoscomentários:sópararelembrar, restritodessarotinae,porisso,foramcriadascomovariáveis
asseguintesconstruções:[ ! $Alb ] &&e[ $M ica ] locais.Arazãoésimplesmenteaeconomiadememória,jáque
||representamamesmacoisa,istoé:nocasodaprimeira, aosairdarotinaelasserãodevidamentedetonadas,coisaque
testamosseavariável$Alb não(!)temnadadentro,então nãoaconteceriaseeunãotivesseusadoesseartifício.
(&&)…Nasegunda,testamosse $M icatemalgumdado, AlinhadecódigoquecriaavariávellocalM gconcatenaao
senão(||)… textorecebido($ )umparêntese,arespostapadrão($ )em
Sevocêreclamoudotamanhodoprograma,éporqueainda caixaalta,umabarra,aoutraresposta($ )emcaixabaixa
nãotedeialgumasdicas.Reparequeamaiorpartedoscript efinalizafechandooparêntese.Usoessaconvençãopara,ao
éparamostrarmensagenscentraliza-
dasnapenúltimalinhadatela.Repare Listagem 1: [Link]
aindaquealgumasmensagenspedem
$ ca i c5 h
umSouumNcomorespostaeoutras
! bi ba h
sãosódeadvertência.Issoéumcaso
Cada a CD e a 5
típicoquepedeousodefunções,que
4
seriamescritassomenteumaveze
5 clea
executadasemdiversospontosdo
Li haMe g=$ ` li e ` - Li ha de e ã ada a g a a e ad
script.Voumontarduasfunçõespara
T C l =$ c l Q d c l a da ela a a e ad a g
resolveressescasosevamosincor-
8 ech
porá-lasaoseuprogramaparavero
I cl ã de M ica
resultadofinal.
======== == =======
–Chico!Agoratrazdoischopes,um
Tí l d Álb :
semcolarinho,paramedarinspira-
| E e ca f i
ção.Evocê,deolhonalistagem 2.
Fai a: < c iad e e a a
Comopodemosver,umafunçãoé
| ie a ee chi e
definidaquandodigitamos e da
N e da M ica:
f çã etodooseucorpoestá
I é e e: Tela ada c ic ech
entrechaves({}).Jáconversamosaqui
hile e
nobotecosobrepassagemdeparâ-
d
metroseasfunçõesosrecebemda
c 5 8 el P ici a e li a li ha ➟
mesmaforma,istoé,sãoparâmetros
86 maio2005 edição08
[Link]
papodebotequim LinuxUser
maio2005 edição08 87
[Link]
LinuxUser Papodebotequim
O comando source $ ce c i b b
Vejasevocênotaalgodediferentenasaídadolsaseguir: j e e j lia a a la il ie
$ d
$ l -la ba h file h e
- - -- -- J li k 45 Ma 8 :45 ba h file $ cd -
h e j e e
Nãoolhearespostanão,volteaprestaratenção!Bem,jáque $ c i b b
vocêestámesmosemsacodepensareprefereleraresposta, j e e j lia a a la il ie
voutedarumadica:achoquevocêjásabequeo ba h - $ d
fileéumdosscriptsquesãoautomaticamenteexecutados h e
quandovocêse“loga”(ARRGGHH!Odeio
essetermo!)nosistema.Agoraolhenova- Listagem 2: Função Pergunta
menteparaasaídadocomandolseme
Pe g a
digaoquehádediferentenela.
{
Comoeudisse,o ba h fileéexe-
A f çã ecebe a â e a eg i e de :
cutadoduranteologon,masreparequeele
nãotemnenhumapermissãodeexecução. 4 $ - Me age a e ada a ela
Issoaconteceporquesevocêoexecutasse 5 $ - Val a e acei c e a ad ã
comoqualqueroutroscriptcareta,nofim $ - O al acei
desuaexecuçãotodooambienteporele S d e $ =Acei a , $ = e $ = , a li ha a
geradomorreriajuntocomoshellsobo 8 eg i c l ca ia e M g al Acei a S
qualelefoiexecutado(vocêselembrade l cal M g= $ `ech $ | a- A-Z` `ech $ | A-Z a- `
quetodososscriptssãoexecutadosem l cal Ta M g=${ M g}
sub-shells,né?).Poiséparacoisasassim l cal C l=$ T C l - Ta M g Ce a g a li ha
queexisteocomandosource,também c $Li haMe g $C l
conhecidopor“.”(ponto).Estecomando ech $M g
fazcomqueoscriptquelheforpassado 4 c $Li haMe g $ C l Ta M g
comoparâmetronãosejaexecutadoem 5 ead - SN
umsub-shell.Masémelhorumexemplo [ ! $SN ] && SN=$ Se a ia c l ca defa l e SN
queumaexplicaçãoem453palavras.Veja ech $SN | A-Z a- A aída de SN e á e i c la
oscriptzinhoaseguir: 8 c $Li haMe g $C l el A aga g da ela
e Sai da f çã
$ ca c i b b }
cd
l
Listagem 3: Função MandaMsg
Elesimplesmentedeveriairparaodire-
f c i Ma daM g
tório acima do diretório atual. Vamos
{
executar uns comandos envolvendo o
A f çã ecebe e e a â e
c i b b eanalisarosresultados:
4 c a e age e e de eja e ibi
5 a a ã b iga g a ad a a a
$ d
a g e e a a , a e $* d
h e j e e
a â e , le b a e ã $
$ c i b b
8 l cal M g= $*
j e e j lia a a la il ie
l cal Ta M g=${ M g}
$ d
l cal C l=$ T C l - Ta M g Ce a g a li ha
h e j e e
c $Li haMe g $C l
ech $M g
Seeumandeielesubirumdiretório,
ead -
porquenãosubiu?Opa,peraíquesubiu
4 c $Li haMe g $C l el A aga g da ela
sim!Osub-shellquefoicriadoparaexe-
5 e Sai da f çã
cutaroscripttantosubiuquelistouos
}
diretóriosdosquatrousuáriosabaixodo
88 maio2005 edição08
[Link]
papodebotequim LinuxUser
maio2005 edição08 89
[Link]
LinuxUser Papodebotequim
90 maio2005 edição08
[Link]
papodebotequim LinuxUser
fi
Sistemas desde 1969 e trabalha com Unix
IFS=
: desde 1980, quando participou do desen-
f A M i $ c -f -d^ ica volvimento do SOX, um sistema operacio-
d nal similar ao Unix produzido pela Cobra
4 ech $A M | g e -i ^$*~ > de ll && ech $A M | c -f -d~ Computadores. Pode ser contatado no
5 d e e-mail [Link]@[Link]
maio2005 edição08 91
[Link]
LinuxUser PapodeBotequim
PapodeBotequim
Curso de Shell Script
ParteIX
T
ábom,jáseiquevocêvaiquererchopeantesdecomeçar, Bom,arespostaé"maisoumenos".Comestescomandos
mastôtãoafimdetemostraroquefizquejávoupedira vocêescreve90%doqueprecisa,porémseprecisarescrever
rodadaenquantoisso.AêChico,mandadois!Odeleésem algoformatadoeleslhedarãomuitotrabalho.Paraformatara
colarinhopranãodeixarcheiroruimnessebigodão… saídaveremosagoraumainstruçãomuitomaisinteressante,
Enquantoochopenãochega,deixaeutelembraroque aprintf.Suasintaxeéaseguinte:
vocêmepediunaediçãopassada:erapararefazer
oprogramalistartistacomatelaformatadaeexe- Listagem 1: [Link] e [Link]
cuçãoemloop,deformaqueelesóterminequando [Link]
receberum[ENTER]sozinhocomonomedoartista. A f çã ecebe e e a â e
Eventuaismensagensdeerroeperguntasfeitasao c a e age e e de eja e ibi
usuáriodeveriamsermostradasnaantepenúltima Pa a ã b iga g a ad a a a
linhadatela,utilizandoparaissoasrotinasexternas 4 a g e e a a , a e $* d
a da g f ce e g a f cquedesenvolvemos 5 a â e , le b a e ã $
M g= $*
durantenossopaponaediçãopassada.
Ta M g=${ M g}
Primeiramenteeudeiumaencolhidanasrotinas
8 C l=$ T C l - Ta M g Ce a g a li ha
a da g f ce e g a f c,queficaramcomo c $Li haMe g $C l
nalistagem 1.Enalistagem 2vocêtemo“grandão”, ead - - $M g
nossaversãorefeitadolistaartista.
–Puxa,vocêchegoucomacordatoda!Gosteida [Link]
formacomovocêresolveuoproblemaeestruturou A f çã ecebe a â e a eg i e de :
$ - Me age a e ada a ela
oprograma.Foimaistrabalhoso,masaapresenta-
$ - Val a e acei c e a ad ã
çãoficoumuitolegalevocêexploroubastanteas
4 $ - O al acei
opçõesdocomandotput.Vamostestaroresultado
5 S d e $ =Acei a , $ = e $ = , a li ha
comumálbumdoEmerson,Lake&Palmerque abai c l ca ia e M g al Acei a S
tenhocadastrado. M g= $ `ech $ | a- A-Z` `ech $ | A-Z a- `
8 Ta M g=${ M g}
Envenenando a escrita C l=$ T C l - Ta M g Ce ali a g a li ha
Ufa!Agoravocêjásabetudosobreleituradedados, c $Li haMe g $C l
masquantoàescritaaindaestáapenasengatinhando. ead - - $M g SN
[ ! $SN ] && SN=$ Se a ia c l ca defa l e SN
Jáseiquevocêvaimeperguntar:“Ora,nãoécomo
SN=$ ech $SN | A-Z a- A aída de SN e á e i c la
comandoechoecomosredirecionamentosdesaída
4 c $Li haMe g $C l el A aga g da ela
queseescrevedados?”.
84 junho2005 edição09
[Link]
PapodeBotequim LinuxUser
Listagem 2: listaartista
i f f a [a g e ] $ ca li a i a h
! bi ba h
Ondeformatoéumacadeia Dad a i a, a a a ica
e a
decaracteresquecontémtrês
4 Li haMe g=$ ` li e ` - Li ha de a g e ã ada
tipos de objeto: caracteres 5 T C l =$ c l Q d de c l a a ela a a e ad a g
simples,caracteresparaes- clea
pecificaçãodeformato(oude ech
–––––––––––––––––-----------------------------------
controle)eseqüênciadeesca-
| Li a T da a M ica de De e i ad A i a |
penopadrãodalinguagem | ===== ===== == ======= == == =========== ======= |
C.argumentoéacadeiade | |
caracteresaserimpressasob | I f e A i a: |
––––––––––––––––----------------------------------–-
ocontroledeformato.
8 hile e
Cadaumdoscaracteresuti- d
lizadoséprecedidopeloca- c 5 5 ech ech=E a e cha a a ã a aga ba a e ical
racter e,logoaseguir,vem ead N e
aespecificaçãodeformatode if [ ! $N e ] $N e e a a i
he
acordocomatabela 1.
4 e g a f c De eja Sai
As seqüências de escape 5 [ $SN = ] && c i e
padrãodalinguagemCsão b eak
sempre precedidas pelo ca- fi
8 fg e -i ^$N e~ ica || fg e ã i e e a ^ c e e ã eg la
racterecontra-barra(\).As
{
reconhecidaspelocomando a da g f c Nã e i e ica de e a i a
printfsãoasdatabela 2. c i e
Nãoacabaporaínão!Tem }
c ech | |
muitomaiscoisasobreessa
4 Li A al=8
instrução,mascomoesseé 5 IFS=
umassuntomuitocheiode :
detalhes e, portanto, chato f A M i $ c -f -d^ ica E cl i e d alb
8 d
paraexplicarepioraindapara
if ech $A M | g e -i ^$N e~
lerouestudar,vamospassar he
diretoaosexemploscomco- c $Li A al
mentários.Vejasó: ech - |
ech $A M | c -f -d~
4 c $Li A al 8
$ i f c ca ac e
5 ech |
$ le Li A al
if [ $Li A al -e $Li haMe g ]
Errado!Sólistou1caractere 8 he
a da g f c Tecle Alg a a C i a
enãosaltoulinhaaofinal
4 c ed A aga a ela a a i da li ha
4 c ech | |
$ i f c\ ca ac e 4 Li A al=8
4 fi
44 fi
45 d e
Saltoulinhamasaindanão 4 c $Li A al ech | |
listouacadeiainteira 4 c $ Li A al
48 ead - - –––--Tecle Alg a a N a C l a––––
4 c ed A aga a ela a a i da li ha
$ i f c ca ac e e\
5 d e
ca ac e e ➟
junho2005 edição09 85
[Link]
LinuxUser PapodeBotequim
86 junho2005 edição09
[Link]
PapodeBotequim LinuxUser
junho2005 edição09 87
[Link]
LinuxUser PapodeBotequim
88 junho2005 edição09
[Link]
PapodeBotequim LinuxUser
${cadeia/%subcad1/subcad2} Se bcad combina com o fim de cadeia, então é trocado por bcad ${Pa a e ã }
C di de i - e ã
junho2005 edição09 89
[Link]
LinuxUser PapodeBotequim
PapodeBotequim
Curso de Shell Script
ParteX
E
aêamigo,tedeiamaiormolezana alegibilidadedocódigoestá“horrorível”, O comando eval
últimaaulané?Umexerciciozinho masodesempenho,istoé,avelocidade V
outedarumproblemaqueeuduvido
muitosimples… deexecução,estáótimo.Comofunções quevocêresolva:
–É,masnostestesqueeufiz,ede sãocoisasmuitopessoais,jáquecada
acordocomoquevocêensinousobre umusaassuasequasenãoháneces- $ a =
substituiçãodeparâmetros,acheique sidadedemanutenção,eusempreopto $ a = a
deveriafazeralgumasalteraçõesnasfun- pelodesempenho.
çõesquedesenvolvemosparatorná-lasde Hojevamossairdaquelachaturaque Tedeiessasduasvariáveisequeroque
usogeral,comovocêdissequetodasas foionossoúltimopapoevoltaràlógica, vocêmedigacomoeuposso,mereferindo
funçõesdeveriamser.Querver? saindodadecoreba.Masvoltoatelem- apenasàvariávela a ,listarovalorde
–Claro,né,mané,setepediparafazer brar:tudoqueeutemostreidaúltimavez a (que,nonossocaso,é3).
éporqueestouafimdeteveraprender, aquinoBotecodoChicoéválidoequebra –Ah,issoémole,mole!Ésódigitar
masperaí,dáumtempo.Chico!Manda umgalhão.Guardeaquelesguardanapos essecomandoaqui:
dois,umsemcolarinho!Vai,mostraaí querabiscamosporque,maiscedoou
oquevocêfez. maistarde,eleslhevãosermuitoúteis. ech $`ech $ a `
–Bem,alémdoquevocêpediu,eu
repareiqueoprogramaquechamavaa Listagem 1: função [Link]
funçãoteriadeterpreviamentedefinidas A f çã ecebe a â e a eg i e de :
alinhaemqueseriamostradaamensa- $ - Me age a e ada a ela
gemeaquantidadedecolunas.Oque $ - Val a e acei c e a ad ã
fizfoiincluirduaslinhas–nasquais 4 $ - O al acei
empregueisubstituiçãodeparâmetros 5 S d e $ =Acei a , $ = e $ = , a li ha
–paraque,casoumadessasvariáveisnão abai c l ca ia e M g al Acei a S
T C l =${T C l :-$ c l } Se ã e a a defi id , ag a e á
fosseinformada,elarecebesseumvalor
8 Li haMe g=${Li haMe g:-$ $ li e - } Ide
atribuídopelaprópriafunção.Alinha
M g= $ `ech $ | a- A-Z` `ech $ | A-Z a- `
demensagemétrêslinhasantesdofim Ta M g=${ M g}
datelaeototaldecolunaséobtidopelo C l=$ T C l - Ta M g Pa a ce ali a M g a li ha
comando c l .Dêumaolhadana c $Li haMe g $C l
listagem 1evejacomoficou: ead - - $M g SN
–Gostei,vocêjáseantecipouaoqueeu 4 SN=${SN:-$ } Se a ia c l ca ad ã e SN
iapedir.Sópragenteencerraressepapo 5 SN=$ ech $SN | A-Z a- A aída de SN e á e i c la
c $Li haMe g $C l el A aga M g da ela
desubstituiçãodeparâmetros,repareque
86 julho2005 edição10
[Link]
PapodeBotequim LinuxUser
Reparequeeucoloqueioech $ a entrecrases(`),porque $ a =l
dessaformaeleteráprioridadedeexecuçãoeresultaráem a . $ $ a
Eech $ a produzirá3… ag h al h i c l gad
–Ah,é?Entãoexecuteparaverseestácorreto. ag h A D DOS li a ica l ga e h
ag h c f li a i a a da g f c
$ ech $`ech $ a ` al h c al h li a i a bg h
$ a
Agoravamoscolocarem a oseguinte: l $ a ;eem
–Ué!Quefoiqueaconteceu?Omeuraciocíniomeparecia a vamoscolocarl*,vejamosoresultado:
bastantelógico…
–Oseuraciocíniorealmentefoilógico,oproblemaéquevocê $ a = l $ a
esqueceudeumadasprimeirascoisasdequetefaleiaquino $ a = l*
Botecoequevourepetir.OShellusaaseguinteordempara $ $ a
resolverumalinhadecomando: l : $ a : N ch file di ec
PResolveosredirecionamentos; $ e al $ a
PSubstituiasvariáveispelosseusvalores; li a ica li a i a li a i a l gad l ga e h
PResolveesubstituiosmetacaracteres;
PPassaalinhajátodaesmiuçadaparaexecução. Novamente,notempodesubstituiçãodasvariáveis, $ a
Dessaforma,quandoointerpretadorchegounafasedere- aindanãohaviaseapresentadoaoShellparaserresolvida.
soluçãodevariáveis,quecomoeudisseéanterioràexecução, Assim,sónosrestaexecutarocomandoevalparadarasduas
aúnicavariávelexistenteera a eporissoatuasolução passadasnecessárias.
produziucomosaída$ a .Ocomandoechoidentificouisso Umavezu mcolegadaexcelentel istaded iscussão[Link]/
comoumacadeiadecaracteresenãocomoumavariável. group/shell-scriptcolocouumadúvida:queriafazerummenu
Problemasdessetiposãorelativamentefreqüenteseseriam quenumerasseelistassetodososarquivoscomextensão he,
insolúveiscasonãoexistisseainstruçãoeval,cujasintaxeé quandoooperadorescolhesseumaopção,oprogramacorres-
e al c d,onde c déumalinhadecomandoqualquer,que pondentefosseexecutado.Vejaminhapropostanalistagem 2:
vocêpoderiainclusiveexecutardiretonopromptdoterminal.
Quandovocêpõeoevalnafrente,noentanto,oqueocorreé Listagem 2: [Link]
queoShelltratac dcomoumparâmetrodoevale,emseguida, ! bi ba h
oevalexecutaalinharecebida,submetendo-aaoShell.Ou
seja,naprática c déanalisadoduasvezes.Dessaforma,se Li a e e e a g a a c e e ã h
executássemosocomandoquevocêpropôscolocandooeval 4 di e i c e e e e ec a e c lhid el e ad
5
nafrente,teríamosasaídaesperada.Veja:
clea i=
i f \ \ \ O çã P g a a
$ e al ech $`ech $ a ` 8 CASE= ca e $ i
f a i * h
d
Esseexemplotambémpoderiatersidofeitodeoutramaneira. i f \ d\ \ $i $a
CASE= $CASE
Dásóumaolhada:
$ i f d \ $i $a
4 i=$ i
$ e al ech \$$ a 5 d e
CASE= $CASE
* e
Naprimeirapassadaacontrabarra(\)seriaretiradae$ a 8 e ac
ead - - I f e a çã de ejada:
seriaresolvidoproduzindo a .Nasegundapassadateriaso-
ech
bradoech $ a ,queproduziriaoresultadoesperado.Agora e al $CASE
voucolocarumcomandodentrode a eexecutar:
julho2005 edição10 87
[Link]
LinuxUser PapodeBotequim
raçãodalinhanaqualfazemosaatribui- 8 e i Li ha al e ada
çãofinaldovalordavariável$CASE.Veja * e
e ac
nalistagem 3comoeleficaria:
ead - - I f e a çã de ejada:
ExistenoLinuxumacoisachamada
ech
sinal( ig al).Existemdiversossinais
e al $CASE
quepodemsermandadospara(ougera-
88 julho2005 edição10
[Link]
PapodeBotequim LinuxUser
julho2005 edição10 89
[Link]
LinuxUser PapodeBotequim
90 julho2005 edição10
[Link]
PapodeBotequim LinuxUser
Paraentendermelhor,vamosexecutaroscript: OPTARG eh i e a
Di e a d i ei $OPTIND- = a g e
$ ge h -h -Pi e a a a O e b da li ha de c a d f i a a
ge fe a a ia el OPT LETRA ig al a h
OPTARG eh Repare,noexemploaseguir,quesepassarmosumaopçãoinválidaa
ge fe a a ia el OPT LETRA ig al a P variável$OPT LETRAreceberáumpontodeinterrogação( )ea$OPTARG
OPTARG eh i e a será"apagada"( e ).
Di e a d i ei $OPTIND- = a g e
O e b da li ha de c a d f i a a $ ge h -f -Pi e a a a A çã –f ã é alida
ge h: illegal i -- f
Dessaforma,semtermuitotrabalho,separei ge fe a a ia el OPT LETRA ig al a
todasasopçõescomseusrespectivosargumentos, OPTARG eh
deixandosomenteosparâmetrosqueforampassa- ge fe a a ia el OPT LETRA ig al a P
dospelooperadorparaposteriortratamento.Repare OPTARG eh i e a
que,setivéssemosescritoalinhadecomandocom Di e a d i ei $OPTIND- = a g e
oargumento(i e a)separadodaopção(-P), O e b da li ha de c a d f i a a
oresultadoseriaexatamenteomesmo,excetopelo
OPTIND,jáquenessecasoeleidentificaumconjun- –Medizumacoisa:vocênãopoderiaterusadoumcondicionalcom
todetrêsopções(ouargumentos)e,noanterior, caseparaevitarogetopts?
somentedois.Vejasó: –Poderiasim,masparaquê?Oscomandosestãoaíparaseremusados…
Oexemplofoididático,masimagineumprogramaqueaceitassemuitas
$ ge h -h -P i e a a a opçõesecujosparâmetrospoderiamounãoestarcoladosàsopções,sen-
ge fe a a ia el OPT LETRA ig al a h doqueasopçõestambémpoderiamounãoestarcoladas:iaserumcase
OPTARG eh infernal!Comgetopts,ésóseguirospassosacima.
ge fe a a ia el OPT LETRA ig al a P –É…Vendodessaforma,achoquevocêtemrazão.Éporqueeujáestou
meiocansadocomtantainformaçãonovanaminha
Listagem 4: [Link] cabeça.Vamostomarasaideiraouvocêaindaquer
$ ca ge h explicaralgumaparticularidadedoShell?
! bi h –Nemumnemoutro,eutambémjácanseimas
hojenãovoutomarasaideiraporqueestouindo
4 E ec e a i : daraulanaUniRIO,queéaprimeirauniversidade
5 federalqueestápreparandoseusalunosdocurso
ge h -h -Pi e a a a degraduaçãoemInformáticaparaousodeSoft-
wareLivre.Masantesvoutedeixarumproblema
8 e e e a i f aç e de da a ç e ã e ibida
parateencucar:quandovocêvariaotamanhode
A cadeia P:h di e a çã -P é a çã c le a umajaneladoterminal,nocentrodelanãoaparece
e e e a g e e e h é a çã i le e ã e e dinamicamente,emvídeoreverso,aquantidadede
a g e linhasecolunas?Então!Euqueroquevocêrepro-
duzaissousandoalinguagemShell.Chico,traz
4 hile ge P:h OPT LETRA rapidinhoaminhaconta!Voucontaratéumese
5 d vocênãotrouxereumemando!
ech ge fe a a ia el OPT LETRA ig al a $OPT LETRA
Nãoseesqueça,qualquerdúvidaoufaltadecompa-
ech OPTARG eh $OPTARG
nhiaparaumchopeésómandarumemailparajulio.
8 d e
ed =`e $OPTIND – `
neves@[Link].Vouaproveitartambémparamandar
ech Di e a d i ei \$OPTIND- = $ ed a g e omeujabá:digaparaosamigosquequemestivera
hif $ ed fimdefazerumcursoporretadeprogramaçãoem
ech O e b da li ha de c a d f i $* Shellquemandeume-mailpara[Link]@tecnohall.
[Link]parainformar-se.Valeu! ■
julho2005 edição10 91
[Link]
LinuxUser PapodeBotequim
Papodebotequim
Curso de Shell Script
E
aírapaz,tudobom? –Nãoestounemaíparaaaparência,oqueeuqueriaéque
–Beleza.Vocêselembradequedaúltimavezvocême vocêexercitasseoqueaprendemos.Medáalistagem 1 praeu
pediuparafazerumprogramaqueimprimissedinami- veroquevocêfez.
camente,nocentrodatela,aquantidadedelinhasecolunas –Perfeito!Quesedaneaaparência,depoisvouteensinar
deumterminalsemprequeotamanhodajanelavariasse? unsmacetesparamelhorá-la.Oquevaleéqueoprogramaestá
Poisé,euatéquefiz,masmesmodepoisdequebrarmuitoa funcionandoeestábemenxuto.
cabeçaaaparêncianãoficouigual. –Pôxa,eeuqueperdiomaiortempotentandodescobrir
comoaumentarafonte…
Listagem 1: [Link] –Deixeissoparalá!Hojevamosverumascoisas
! bi ba h bastanteinteressanteseúteis.
4 M da $ l -l i e
5 { - - -- j li di a Ja : i e |
clea
C l =$ c l
o nacolunamaisàesquerdaindicaque fif
8 Li =$ li e
c $ $Li $ C l - Ce da ela
éumnamedpipe.Orestodosbitsdecontrolede
ech $B ld$Re $C l X $Li $N permissões,quempodelerougravaropipe,funcio-
} namcomoumarquivonormal.Nossistemasmais
modernosumabarravertical(|),oupipe,nofimdo
clea nomedoarquivoéoutradicae,nossistemasLINUX,
4 ead - - M de a a h da ela ecle alg a a e i a ondeo l podeexibircores,onomedoarquivoé
escritoemvermelhoporpadrão.
86 agosto2005 edição11
[Link]
PapodeBotequim LinuxUser
Tabela 1
Programa1 Programa2
Bloco 1 Rotina de classificação de três grandes arquivos Rotina de abertura e geração de menus
Bloco 2 Acertos finais e encerramento Impressão dos dados classificados pelo programa 1
agosto2005 edição11 87
[Link]
LinuxUser PapodeBotequim
… Então,oquefazer?Pararesolveroproblemadeconcor-
el e rência,vamosutilizarumnamedpipe.Criamososcriptna
e i listagem 2queseráodaemonquereceberátodosospedidos
fi paraincrementarocontador.Notequeelevaiserusadopor
qualquerpáginanonossositequeprecisedeumcontador.
Apósaexecuçãodeseuprimeirobloco,oprograma2passará Comoapenasestescriptalteraosarquivos,nãoexisteopro-
a"ouvir"opipe1,ficandoparadoatéqueasclassificaçõesdo blemadeconcorrência.
Programa1terminem,testandoaseguiramensagempassada Estescriptseráumdaemon,istoé,rodaráemsegundoplano.
pelopipe1paradecidirseosarquivosestãoíntegrosparaserem Quandoumapáginasofrerumacesso,elaescreveráasuaURL
impressosouseoprogramadeveráserdescontinuado.Dessa nopipe.Paratestar,executeestecomando:
formaépossíveldispararprogramasdeformaassíncronae
sincronizá-losquandonecessário,ganhandobastantetempo ech e e agi a h l > i e c ad
deprocessamento.
Paraevitarerros,emcadapáginaaquequisermosadicionar
Bloqueio de arquivos ocontadoracrescentamosaseguintelinha:
SuponhaquevocêtenhaescritoumCGI(CommonGatewayInter-
face)emShellScriptparacontarquantoshitsumadeterminada <!-- e ec c d= ech $REQUEST URI > i e c ad -->
URLrecebeearotinadecontagemestádaseguintemaneira:
Notequeavariável$REQUEST URIcontémonomedoarquivo
Hi = $ ca age hi > de ll || Hi = queobrowserrequisitou.Esseexemploéfrutodeumatroca
ech $ Hi =Hi > age hi deidéiascomoamigoemestreemShellThobiasSalazarTre-
visan,queescreveuoscriptecolocou-oemseuexcelentesite
Dessaforma,seapáginareceberdoisoumaisacessossimul- ([Link]).Aconselhoatodososquequeremaprender
tâneos,umoumaispoderáserperdido,bastandoqueosegundo Shelladarumapassadalá.
acessosejafeitoapósaleituradoarquivo age hi eantes Vocêpensaqueoassuntonamedpipesestáesgotado?Enga-
dasuagravação,istoé,apósoprimeiroacessoterexecutadoa nou-se.Voumostrarumusodiferenteapartirdeagora.
primeiralinhadoscripteantesdeexecutarasegunda.
Substituição de processos
Listagem 2: [Link] VoumostrarqueoShelltambémusaosnamed
! bi ba h pipesdeumamaneirabastantesingular,queéa
substituiçãodeprocessos(processsubstitution).Uma
PIPE= i e c ad a i a ed i e substituiçãodeprocessosocorrequandovocêpõe
4 di de e a c l cad a i c ad e de cada agi a um <ouum >grudadonafrentedoparênteseda
5 DIR= a c ad esquerda.Digitarocomando:
88 agosto2005 edição11
[Link]
PapodeBotequim LinuxUser
$ l -l > ca ! bi ba h
l- –– j e e j e e 4 A g : de fd -> i e:[ 5 ] LIST= C iada hell i ci al
l | hile ead FILE I ici d b hell
É…Realmenteéumnamedpipe.Vocêdeveestarpensando d
queistoéumamaluquicedenerd,né?Entãosuponhaquevocê LIST= $FILE $LIST Al e ada de d b hell
tenhadoisdiretórios,chamadosdi edi bk ,edesejasaber d e Fi d b hell
seosdoissãoiguais.Bastacompararoconteúdodosdiretórios ech $LIST
comocomandocmp:
Noiníciodesteexemploeudissequeeleerameramente
$ c < ca di * < ca di bk * || ech back f ad didáticoporqueexistemformasmelhoresdefazeramesma
tarefa.Vejasóestasduas:
ou,melhorainda:
$ l | l
$c < ca di * < ca di bk * > de ll || ech back f ad
ouentão,usandoaprópriasubstituiçãodeprocessos:
Esteéumexemplomeramentedidático,massãotantosos
comandosqueproduzemmaisdeumalinhadesaídaqueele $ ca - < l
servecomoguiaparaoutros.Euquerogerarumalistagemdos
meusarquivos,numerando-os,eaofinalmostrarototalde Umúltimoexemplo:vocêdesejacomparara ea usando
arquivosnodiretóriocorrente: ocomandoc ,masessecomandonecessitaqueosarquivos
estejamclassificados.Entãoamelhorformadeprocederé:
hile ead a
d $ c < a < a
i a i a eh ece a i i iciali a i
ech $i: $a Essaformaevitaquevocêfaçaasseguintesoperações:
d e < < l
ech N di e i c e e ` d` e i e $i a i $ a >
$ a >
Tálegal,euseiqueexistemoutrasformasdeexecutara $ c
mesmatarefa.Usandoocomandowhile,aformamaiscomum $ -f
deresolveresseproblemaseria:
Pessoal,onossopapodebotequimchegouaofim.Curtimuito
l | hile ead a erecebidiversoselogiospelotrabalhodesenvolvidoaolongo
d dedozemesese,omelhordetudo,fizmuitasamizadesetomei
i a i a eh ece a i i iciali a i muitoschopesdegraçacomosleitoresqueencontreipelos
ech $i: $a congressosepalestrasqueandofazendopelonossoquerido
d e Brasil.Medespeçodetodosmandandoumgrandeabraçoaos
ech N di e i c e e ` d` e i e $i a i barbudosebeijosàsmeninaseagradecendoosmaisde100
emailsquerecebi,todoselogiososedevidamenterespondidos.
Aoexecutaroscript,tudopareceestarbem,porémnocoman- Àsaúdedetodosnós:Tim,Tim.
do ech apósod e,vocêveráqueovalorde$ifoiperdido. -Chico,fechaaminhacontaporquevoupracasa! ■
Issodeve-seaofatodestavariávelestarsendoincrementadaem
Julio Cezar Neves é Analista de Suporte de Sistemas desde 1969 e
Sobreoautor
umsub-shellcriadopelopipe(|)equeterminounocomando
d e,levandocomeletodasasvariáveiscriadasnoseuinterior trabalha com Unix desde 1980, quando participou do desenvolvi-
easalteraçõesláfeitasporvariáveiscriadasexternamente. mento do SOX, um sistema operacional similar ao Unix produzido
Somenteparatemostrarqueumavariávelcriadaforado pela Cobra Computadores. É autor do livro Programação Shell
Linux, publicado pela editora Brasport. Pode ser contatado no
sub-shellealteradaemseuinteriorperdeasalteraçõesfeitas
e-mail [Link]@[Link]
quandoosub-shellseencerra,executeoscriptaseguir:
agosto2005 edição11 89
[Link]