You are on page 1of 14

Roteiro da disciplina EA872

Atividade 1

EA872 Laboratrio de Programao de Software Bsico


Atividade 1
1.

Tema
Interpretador de comandos de um sistema operacional.

2.

Objetivos

3.

Familiarizao com o ambiente UNIX no contexto de programao de comandos.


Introduo aos shells do sistema UNIX.
Introduo linguagem de programao do Bourne shell do UNIX.
Implementao de novos comandos.

Conceitos de sistema operacional

O sistema operacional deve fornecer, entre outros, os seguintes recursos para possibilitar a
operao normal de um computador:

gerncia de memria;
controle e gerncia de unidades de disco;
carregamento e execuo de programas;
atendimento de requisies de programas em execuo;
comunicao com o usurio.

Para tais funes, o sistema operacional conta com dois componentes bsicos: o ncleo e o
interpretador de comandos.
3.1.

Ncleo do sistema operacional


O ncleo (kernel) contm as rotinas bsicas do sistema operacional, responsveis pela
operao do sistema no nvel de mquina e pelas conexes com os dispositivos de hardware.
As funes do ncleo so de dois tipos: autnomas e no-autnomas. Alocao de memria e
de CPU so exemplos de funes autnomas, pois so executadas pelo ncleo sem serem requisitadas
explicitamente pelos processos do usurio. Por outro lado, alocao de recursos e criao de processos
so requisitados pelos processos do usurio atravs de chamadas ao sistema (system calls). Exemplos
de chamadas ao sistema incluem: fork, exec, kill, open, read, write, close e exit.
3.2.

Interpretador de comandos
O interpretador de comandos o programa que implementa a interface do sistema operacional
com o usurio. Este programa projetado para facilitar o acesso do usurio ao potencial do sistema
operacional, sem a necessidade de comunicao direta com o ncleo.
No UNIX, o interpretador de comandos fornecido por um programa denominado shell. O
ncleo e o shell do sistema operacional UNIX se relacionam com os utilitrios, o hardware e o usurio
de acordo com o esquema apresentado na Figura 1.

4.

Shells do Sistema UNIX

O processo shell pode ser chamado automaticamente durante o login ou manualmente atravs
da entrada do nome do processo pelo teclado. Independente da forma como chamado, ele trabalha na
seguinte sequncia:

Copyright 2015 DCA/FEEC/UNICAMP

Roteiro da disciplina EA872

Atividade 1
Usurios

Utilitrios

Shell

Ncleo
Sistema operacional

Hardware

Figura 1 - Anatomia do UNIX


1. l as informaes de iniciao do ambiente shell (tipo de terminal, tipo de prompt, os
caminhos de busca em diretrios, etc.) a partir dos seguintes arquivos: .profile, .login e
.cshrc, que se encontram no diretrio-raiz do usurio e no diretrio /etc do sistema;
2. o sinal de prompt apresentado e o processo aguarda um comando do usurio (lembre-se que
o UNIX diferencia letras maisculas de minsculas);
3. se o usurio entrar com ctrl-d, o processo terminado; caso contrrio, executa o comando
do usurio e retorna ao passo (2).
shells:

Normalmente encontram-se instalados no sistema UNIX pelo menos um dos seguintes tipos de

Bourne Shell (sh): escrito por Steve Bourne (Bell Labs) e disponvel em praticamente todos os
sistemas UNIX e Linux. Foi o primeiro shell popular do UNIX e considerado o shell padro. No
entanto, ele no apresenta muitos dos recursos interativos disponveis no C shell e Korn shell, mas
fornece uma linguagem muito fcil de usar na escrita de shell scripts. Uma nova verso do mesmo
chamada Bash (Bourne-again shell) contempla os melhores recursos do C shell e do Korn shell,
alm de procurar ser compatvel com o sh e com a norma de padronizao de UNIX (POSIX).
C Shell (csh): escrito na University of California at Berkeley, segue o mesmo conceito do Bourne
shell, mas os seus comandos obedecem a uma sintaxe similar da linguagem C (da o seu nome).
Korn Shell (ksh): escrito por David Korn (Bell Labs). Ele fornece todas as caractersticas do C shell,
juntamente com uma linguagem de programao para shell scripts similar ao Bourne shell original.
Portanto, ele uma extenso do Bourne shell, com aperfeioamentos no controle de tarefas, na
edio de linhas de comando e na linguagem de programao. o mais poderoso dos trs, e
fornecido como o shell padro em alguns sistemas UNIX.
Uma vez disponveis, possvel utilizar qualquer um destes shells, de acordo com a
preferncia do usurio.
Destacam-se as seguintes facilidades oferecidas pelos shells do sistema UNIX:
interpretar uma sequncia de comandos concatenados por palavras reservadas;
iniciar a execuo de comandos ou cdigos executveis;
redirecionar a entrada e a sada dos processos;
concatenar uma sequncia de comandos num arquivo, denominado shell script (procedimento de
shell), de modo que, para executar a tal sequncia, s entrar o nome do arquivo (o qual deve estar
com permisso para execuo);
suportar a execuo de vrios processos concorrentes em background;
criar novos shells-filho ou subshells para executar, por exemplo, os processos em background;
suportar variveis locais e globais para, por exemplo, definir e acessar de forma flexvel as
caractersticas do ambiente de um shell;
admitir o uso de metacaracteres nas linhas de comando para mapear um conjunto de arquivos;
concatenar o fluxo de dados entre os processos atravs do pipe (representado pela barra vertical);
substituir os comandos pelo seu resultado.

Copyright 2015 DCA/FEEC/UNICAMP

Roteiro da disciplina EA872

5.

Atividade 1

Linguagem de Programao do Bourne Shell


Vrios fatores justificam a adoo do Bourne shell (sh) neste curso:

o Bourne shell foi o primeiro interpretador de comandos a ganhar popularidade, sendo que muitos
scripts foram escritos na sua linguagem;
o Bourne shell um subconjunto do Korn shell, um interpretador que tem bastante popularidade. O
conhecimento da sua sintaxe vai certamente ajudar a compreender o Korn shell;
uma variante mais completa do Bourne shell conhecida como bash tambm muito popular e
adotada como padro e distribuies Linux importantes, como o Ubuntu.
Conforme j mencionado, um shell l tanto os comandos do terminal, arquivo-padro de
entrada, como os comandos de um script (arquivo com comandos definido pelo usurio).
Obs:
adotaremos a conveno de sublinhar aquilo que digitado pelo usurio;
podemos usar bash no lugar de sh nos exemplos mostrados a seguir;
os arquivos de script descritos neste roteiro esto disponveis na pgina da disciplina.
Exemplo 1 Seguem alguns exemplos de comandos que podem ser acionados a partir do shell;
experimente-os e veja quais so seus resultados.
$ps

$psu
$psaux

$psaux
|
grepseu_nome_de_usurio

Tarefa 1: consulte as pginas de manual (man ps) e explique o que o comando ps aux faz.
Exemplo 2 Os seguintes blocos de comandos:
$psaux|grepswapper

e
$shteste1swapper(oubashteste1swapper)

onde o arquivo de script <teste1> contm a linha de comando:


psaux|grep$1

so equivalentes. Os argumentos $1, $2, ... em <teste1> so os parmetros posicionais a serem


fornecidos ao processo sh, como veremos mais adiante.
O fluxo de execuo dos comandos/programas num script no necessariamente sequencial. O
shell sh prov algumas primitivas de controle rudimentares que podem causar desvios condicionais ou
incondicionais nesse fluxo. Outra flexibilidade oferecida pela linguagem de programao do sh um
conjunto de operaes sobre variveis.
5.1.

Variveis de Shell
Os nomes de variveis vlidos so concatenaes de letras, dgitos e underscore ( _ ),
precedidas de uma letra. O operador que fornece acesso ao valor de uma varivel $. Com a operao
de atribuio = pode-se atribuir um valor a uma varivel. Caso a varivel ainda no exista, ela
criada automaticamente.
Exemplo 3 No seguinte bloco de comandos criada uma varivel <x> e atribudo a ela um valor:
prompt>sh
$echo$x
$x='Helloworld'
$echo$x
Helloworld
$ctrld

(iniciarnovoshellsh)
(mostrarocontedodex)
(alterarcontedodex)
(mostrarocontedodex)
(contedoretornado)
(terminarsessodeshellatualevoltarparashell
anterior)

prompt>

Copyright 2015 DCA/FEEC/UNICAMP

Roteiro da disciplina EA872

Atividade 1

Antes do comando de atribuio de <x>, o seu valor indefinido, como mostra o primeiro
comando echo. O prompt $ indica que sh aguarda a entrada de um novo comando.
O interpretador sh oferece a possibilidade de ler o valor de uma varivel do arquivo de entrada
padro atravs do comando read.
Exemplo 4 O seguinte arquivo script <teste2> demonstra o uso do comando read.
#!/bin/sh
#==>garantequeoscriptserexecutadopor/bin/sh
echo"Entrecomoseunome:"
readnomesobrenome
echo"EntrecomoseuRA:"
readRA
echo"Seunomee"$nome
echo"Seusobrenomee"$sobrenome
echo"SeuRAe"$RA

Ao entrarmos com o comando


$shteste2

teremos o seguinte resultado na tela:


Entrecomoseunome:
JoseSilva
EntrecomoseuRA:
900000
SeunomeeJose
SeusobrenomeeSilva
SeuRAe900000

Tarefa 2: experimente executar o script teste2 de duas formas: com o comando shteste2 e
depois entrando linha a linha em um prompt do shell. Que diferenas voc nota no
comportamento do script e nos resultados comparando estas duas execues. dos comandos linha
a linha no prompt de comando com a execuo via arquivo de script?
Para garantir que o shell script sempre vai ser executado pelo Bourne shell padro, a primeira
linha do arquivo deve ser
#!/bin/sh

O interpretador sh mantm uma tabela de variveis de ambiente para armazenar um conjunto


de informaes sobre o contexto em que ele executado. Normalmente os valores globais dessas
variveis so atribudos no momento de login e modificveis localmente pelo comando de atribuio
dentro de cada processo sh. Como ocorre com todas as variveis definidas num shell, as modificaes
locais s afetaro os processos-filho se os valores forem exportados explicitamente pelo comando
export.
Para listar todas as variveis de ambiente de um shell podemos usar o comando env. A Tabela
1 mostra algumas dessas variveis.
Tabela 1
Varivel

Significado

Verificao no seu
ambiente corrente
DISPLAY
identificao do terminal
echo $DISPLAY
EDITOR
caminho para seu editor default
echo $EDITOR
HOME
diretrio no qual a rvore de arquivos privado de cada usurio
echo $HOME
est armazenada
LOGNAME
nome de login do usurio
echo $LOGNAME
MAIL
arquivo de correio eletrnico. Quando este arquivo
echo $MAIL
modificado, recebe-se a mensagem you have mail
PATH
lista de diretrios que devem ser varridos para localizar os
echo $PATH
comandos
PS1
prompt para a entrada de um novo comando
(valor default $)
PS2
prompt para a continuao de um comando
(valor default >)
SHELL
tipo de interpretador de comandos corrente
echo $SHELL
TERM
tipo do terminal
echo $TERM
USER
nome do usurio
echo $USER

Copyright 2015 DCA/FEEC/UNICAMP

Roteiro da disciplina EA872

Atividade 1

Tarefa 3: descubra e documente o valor atual de cada varivel da tabela 1.


Quando sh l os comandos de um arquivo criado pelo usurio, ele aceita, alm do nome do arquivo
(parmetro posicional $0), nove argumentos referenciveis no arquivo, que so os parmetros
posicionais $1, $2, , $9. O sh reserva duas variveis $* e $@ para designar todos os parmetros
posicionais, de $1 at $9, e a varivel $#, para designar o nmero de parmetros posicionais diferentes
de $0, ou seja, o nmero de argumentos do comando.
Outras variveis locais pr-definidas no sh so:
Tabela 2
Varivel
$$$
$?
$!

Significado
as opes entradas ao iniciar o processo sh, tais como <-x> e <-v>
identificao do processo sh corrente (pid)
valor retornado pelo ltimo comando executado
identificao do ltimo processo (pid) executado em background

Tarefa 4: descubra e documente o valor atual das variveis $$, $? e $! no seu shell.
Finalmente, sh oferece a possibilidade de proteger uma varivel de manipulaes indevidas
atravs do uso do comando readonly.
Exemplo 5 Este exemplo mostra o uso do comando readonly.
$x='Alo!'
$y='CursoEA872!'
$echo$x$y
Alo!CursoEA872!
$readonlyxy
$readonly
readonlyx
readonlyy
$x='Hello!'
x:isreadonly

5.2.

Blocos de Controle
O sh suporta os seguintes blocos de controle:

if...then...else...fi : equivalente ao comando if...then...else... da linguagem C.

if...then...elif...fi : equivalente ao comando if...then...elseif...fifi

while...do...done : equivalente ao comando while da linguagem C.

until...do...done : equivalente ao comando do...until da linguagem C.

for...do...done : equivalente ao comando for da linguagem C.

case...in...)...;;...)...;;esac : equivalente ao comando switch...case da linguagem C.

5.3.

Expresses em sh
A linguagem de sh suporta um conjunto de operadores para definir comandos mais complexos:

Atribuio: =
Redireo de Entrada e Sada: no sh existem diferentes formas para redirecionar os arquivos de
entrada e sada padro (Tab. 3).
Tarefa 5: crie 2 exemplos de redirecionamento de entrada e sada usando a tabela 3.

Copyright 2015 DCA/FEEC/UNICAMP

Roteiro da disciplina EA872

Atividade 1
Tabela 3

Instruo
> arquivo
>> arquivo
< arquivo
p1 | p2
n > arquivo
n >> arquivo
n > &m
n < &m
<< c
<< \c
<< 'c'
<< "c"

Significado
redirecionar a sada-padro para <arquivo>
anexar dados da sada-padro a <arquivo>
usar <arquivo> como entrada-padro
conectar a sada-padro do processo p1 com a entrada-padro do processo p2
redirecionar a sada do arquivo de programa cujo descritor <n> para <arquivo>
anexar a sada do arquivo de programa cujo descritor <n> a <arquivo>
concatenar a sada do programa cujo descritor <n>, com o arquivo de descritor <m>
concatenar a entrada do arquivo cujo descritor <n>, com o arquivo de descritor <m>
aceitar caracteres da entrada-padro at a sequncia <c>, onde <c> formada por
caracteres quaisquer, sendo que caracteres especiais so interpretados
equivalente a << c, mas sem a interpretao de caracteres especiais
equivalente a << \c
equivalente a << 'c' , mas com a interpretao dos operadores $, '...' e \

Substituio de caracteres: sh reserva alguns caracteres para denotar um conjunto de caracteres ou um


conjunto de sequncias de caracteres (Tab. 4).
Tabela 4
Caracter
*
?
[]
a|b

Interpretao
Qualquer sequncia de caracteres incluindo a sequncia nula
qualquer caracter
Qualquer caracter definido no domnio especificado
opo alternativa entre as sequncias <a> e <b>. S usado
nos blocos de controle case

Exemplo
ls *
ls [a-j]*

Tarefa 6: crie, execute e documente 3 exemplos de uso de substituio de caracteres com *, ? e [ ]


(um para cada).
Interpretao de caracteres: Para distinguir os caracteres com interpretaes especiais dos caracteres
comuns, sh dispe dos seguintes mecanismos (Tab. 5):
Tabela 5
Notao
...
'...'
...
`...`

Interpretao
os caracteres so interpretados
os caracteres so tomados literalmente
os caracteres so tomados literalmente, depois que os
operadores $, ... e \ forem interpretados
os caracteres so tomados como um comando

Exemplo
echo caminhos = $PATH
echo 'caminhos = $PATH'
echo caminhos = $PATH
echo `pwd`

Tarefa 7: execute os exemplos da tabela 5 e discuta as diferenas nos resultados.


Substituio de Variveis: quando o valor de uma varivel no setado, ento ele assume a sequncia
nula. sh dispe, entretanto, de operadores adicionais para substituir o valor das variveis (Tab. 6).
Tabela 6
Notao
$var
$var=
${var:-op}
${var:=op}
${var:?msg}

${var:+op}

Interpretao
Exemplo
se o valor de <var> no setado, ele assume a sequncia
nula
se o valor de <var> no setado, o valor default
echo ${x:-`pwd`}
assumido a sequncia <op>
se o valor de <var> no setado, o valor default assuecho ${x:=`pwd`}
mido a sequncia <op> e <var> setado como <op>
se o valor de <var> no setado, <msg> impressa; echo ${x:?variavel x vazia}
<msg> pode ser uma sequncia vazia; neste caso a
mensagem var: parameter null or not set impressa se
<var> for nulo
se o valor de <var> setado, executar a sequncia <op>;
echo ${p:+$PATH}
caso contrrio, no fazer nada

Copyright 2015 DCA/FEEC/UNICAMP

Roteiro da disciplina EA872

Atividade 1

Combinao de Comandos: O sh prov vrios operadores, tais como || (or), && (and), | (pipe) e
; , para combinar os comandos. Por exemplo, a combinao comando_1&&comando_2 executar
o comando_2 apenas se o cdigo de sada do comando_1 for zero (sucesso). J a forma comando_1
|| comando_2 executar o comando_2 apenas se o cdigo de sada do comando_1 for no nulo
(fracasso). O cdigo de sada final (global) destas combinaes o cdigo de sada do ltimo comando
executado na lista de comandos. A combinao comando_1|comando_2 criar uma conexo direta
entre a sada de comando_1 e a entrada de comando_2, fazendo com que os dados de sada do
primeiro sejam utilizados como dados de entrada do segundo. Por fim, a combinao comando_1;
comando_2 executar os comandos em sequncia, pois o shell esperar o trmino de um antes de
comear o outro.
Vamos exemplificar mais com o comando test , que um programa disponvel no UNIX para
verificar a validade de uma expresso. Ele retorna 0 (sucesso), se a expresso verdadeira; caso
contrrio, ele retorna um valor diferente de 0 (fracasso).
Exemplo 6 A expresso
teste<nome_do_arquivo>&&echoarquivo<nome_do_arquivo>existe

equivalente ao bloco
ifteste<nome_do_arquivo>thenechoarquivo<nome_do_arquivo>existe
fi

enquanto a expresso
teste<nome_do_arquivo>||echoarquivo<nome_do_arquivo>noexiste

equivalente ao bloco
iftest!e<nome_do_arquivo>
#Obs:osmbolo!negaacondio
thenechoarquivo<nome_do_arquivo>naoexiste
fi

Agrupamento: Existem duas formas para agrupar um bloco composto de mais de um comando:
por chaves, como em {comando_1;comando_2;} ou
por parnteses, como em (comando_1;comando_2).
No primeiro caso, os comandos so simplesmente executados no shell corrente; no segundo, um novo
processo-filho sh criado para executar os comandos. Aps execut-los o processo-filho terminado.
Exemplo 7 A expresso
$(cd/usr;lsl)

equivalente ao seguinte bloco de comandos executados em um processo-filho iniciado pelo sh:


prompt>sh
$cd/usr;lsl
$ctrld

Execuo em background: basta colocar o smbolo & aps o comando para que ele seja executado em
segundo plano (background).
Expresses aritmticas : sh no suporta expresses aritmticas diretamente, mas pode-se usar o
programa expr para avaliar os valores de expresses que podem ser construdas com os seguintes
operadores binrios: \* (multiplicao), / (diviso), % (resto), + (adio), - (subtrao), = (igual), \>
(maior), \>= (maior ou igual), \< (menor), \<= (menor ou igual), != (diferente), \& (E lgico) e \| (OU
lgico).
Exemplo 8 Os operadores e operandos devem ser separados pelo espao em branco, como mostram os
seguintes casos:
$y=`expr40/2`
$x=`expr$y\*5`
$z=`expr\($x+$y\)6`

Copyright 2015 DCA/FEEC/UNICAMP

Roteiro da disciplina EA872

Atividade 1

5.4.
Linhas de Comentrios
As linhas de comentrios no so processadas pelo sh e so demarcadas pelos caracteres # e linefeed.
5.5.

Tratamento de sinais de erros


O sistema UNIX pode gerar diferentes sinais durante a execuo de um processo e o processo
pode incluir um tratador de sinais (handler) para process-los convenientemente.
No processo sh pode-se usar o comando
trap'<comandos>'<sinais>

para tratar um conjunto de sinais <sinais> captado pelo sh. Os comandos na lista <comandos> devem
ser separados por ; .
A seguinte tabela apresenta alguns sinais mais comuns:
Tabela 7
Sinal
SIGHUP
SIGINT
SIGQUIT
SIGILL
SIGFPE
SIGKILL
SIGBUS
SIGSEGV
SIGSYS
SIGALRM
SIGTERM
SIGCONT
SIGCHLD

6.

Representao
1
2
3
4
8
9
10
11
12
14
15
19
20

Significado
hangup
interrupo
quit
instruo de mquina ilegal
erro no processamento de pontos flutuantes
matar um processo (no pode ser capturado ou ignorado)
erro no barramento
violao na segmentao (referncia a end. de memria invlido)
argumentos incorretos para a chamada ao sistema
alarme
sinal (em software) para terminar um processo
continua um processo que est parado (suspenso)
sinal de parada enviado do processo-pai para o processo-filho

Dicas sobre implementao de scripts

O Bourne shell (sh) usa o arquivo .profile (ou .bashrc no caso de bash) existente no diretrio
de cada usurio (use echo$HOMEpara ver o seu) como arquivo de iniciao no processo de login. Se
tambm existir o arquivo do sistema /etc/profile, este ser usado primeiro. necessrio utilizar o
comando export para que as variveis definidas no login sh sejam reconhecidas por outros shells.
Quando o usurio entra com um comando, o shell verifica se ele est definido internamente
(built-in command). Se no estiver, o shell faz uma busca ao comando (arquivo executvel cujo nome
o comando) em cada diretrio que est definido na varivel de ambiente $PATH. Sendo assim, para que
o arquivo correspondente a cada shell script que voc vai criar (utilizando um editor de texto) seja
executvel, adicione ao modo do arquivo recm-criado a opo executvel pelo proprietrio atravs
do comando mostrado no prximo exemplo.
Exemplo 9 Comando de alterao de permisses usado para permitir a execuo de um script:
$chmodu+xmeuscript
(chmod=comandochangemode;u=usurio;+=adicionarpermisso;
x=permissodeexecuo)
$meuscript
(agora,bastadigitarmeuscriptparateraexecuodoscript)

Uma forma alternativa de execuo passar o seu shell script (arquivo pode ser noexecutvel) como argumento para o shell, que ir interpret-lo.
$shmeuscript(executameuscriptmesmosemusarochmodu+xantes)
Nesta atividade vamos criar um diretrio bin em nosso diretrio $HOME e adicionar ao
$HOME/bin alguns comandos teis. Portanto, para que estes comandos sejam reconhecveis sob
qualquer diretrio, preciso verificar se o caminho $HOME/bin faz parte da lista na varivel $PATH.
Caso no faa, pode-se introduzir o caminho atravs da atribuio mostrada a seguir.

Copyright 2015 DCA/FEEC/UNICAMP

Roteiro da disciplina EA872

Atividade 1

Tarefa 8: execute os comandos do Exemplo 10 abaixo e explique o que se pede em cada um.
Exemplo 10
$echo$PATH(qualfoioresultado?)
$PATH=$HOME/bin:$PATH(oquefazestalinha?)
$exportPATH(oquefazestalinha?Quandoelanecessria?)
$echo$PATH(mudoualgonoresultado?Oque?Porque?)

Para verificar onde um script produz um erro (se aplicvel) use o comando:
$shxmeuscript

A opo -x avisa ao shell que exiba os comandos que esto sendo executados, permitindo
assim descobrir que comando responsvel pelo erro.

7.

Outros exemplos

Alguns exemplos abaixo esto disponveis na pgina web da disciplina, mas podem tambm ser
copiados deste roteiro.
Exemplo 11
Para ler a entrada padro no shell script utilize o comando read.
echo"Entrecomoseunome:"
readname
echo"Prazeremconheclo(a),$name"

Se h mais de uma palavra na entrada, cada palavra pode ser atribuda a diferentes variveis.
Todas as palavras excedentes so atribudas ltima varivel.
Exemplo 12
O comando eval toma o argumento na linha de comando e o executa.
echo"Entrecomumcomando:"
readcomando
eval$comando

Exemplo 13
Os arquivos shell scripts podem agir como se fossem comandos padres do UNIX, tomando
argumentos a partir da linha de comando, os quais so atribudos aos parmetros posicionais $1 at $9.
O parmetro posicional $0 se refere ao nome do comando ou nome do arquivo executvel que contm o
shell script. O caracter especial $* referencia todos os parmetros posicionais.
$catprog1
#Estescriptecoaosprimeiros5argumentos
#fornecidosaoscript
echoOsprimeiros5argumentosnalinha
echodecomandosao:$1$2$3$4$5
$prog1EstoufazendoadisciplinaEA872
Osprimeiros5argumentosnalinha
decomandosao:EstoufazendoadisciplinaEA872

Exemplo 14
Para executar uma ao condicional, utilize o comando if.
$catprog2
ifwho|grepsMaria>/dev/null
then
echo"Mariaestalogada"
else

Copyright 2015 DCA/FEEC/UNICAMP

Roteiro da disciplina EA872

Atividade 1

echo"Marianaoestadisponivel"
fi

Neste exemplo, a opo s faz com que o comando grep opere silenciosamente, sendo que
qualquer mensagem de erro direcionada para o arquivo /dev/null em lugar da sada padro.
Exemplo 15
O comando case permite operar o fluxo de controle para mltiplas condies definidas a
partir de uma nica varivel. O contedo da varivel comparado com padres at que um casamento
ocorra, quando os comandos associados so executados. Em seguida, o controle passado ao primeiro
comando aps esac. Cada linha de comando deve terminar com um ponto-e-vrgula duplo. Um
comando pode estar associado a mais de um padro, desde que os padres estejam separados por |. O
caracter * pode ser utilizado para especificar um padro default.
$catdiario
hoje=`date+%m/%d`#apresentaadatanoformatomes/dia
case$hojein
03/02) echo
"auladeEA872";;
03/09) echo
"atividadespraticasdeEA872";;
*)
echo
"estudarEA872";;
esac
$date+%m/%d
03/02
$diario
auladeEA872

Exemplo 16
O script prog2 visto antes pode ser estendido para operar mltiplos usurios, agora
introduzidos como argumentos. Para tanto, utiliza-se o comando for.
$catprog3
foriin$*
do
ifwho|greps$i>/dev/null
then
echo"$iestalogado(a)"
else
echo"$inaoestadisponivel"
fi
done

Exemplo 17
O comando while executa um comando enquanto a condio for verdadeira.
$catprog4
whilewho|greps$1>/dev/null
do
sleep60
done
echo"$1naoestamaislogado(a)"

Dentro de loops, possvel utilizar os comandos break e continue.


$catprog5
whileecho"Entrecomumcomando"
readresponse
do
case"$response"in
'done')
break;;
#naotemmaiscomandos
"")
continue;;
#comandonulo
*)
eval$response;;
#executaocomando
esac
done

Exemplo 18
Para incluir texto em um shell script, possvel utilizar um tipo especial de redirecionamento.
$catprog6

Copyright 2015 DCA/FEEC/UNICAMP

10

Roteiro da disciplina EA872

Atividade 1

cat<<EOF
Nomomento,esteshellscriptestaemfasededesenvolvimento.
Favorrelatarqualquerproblemaaoseuautor(nome@dominio)
EOF
exec/usr/local/teste/versao_de_teste

8.

Atividades Prticas

Estas atividades devero ser realizadas e documentadas em seu relatrio. A pontuao


referente a cada unidade est indicada no incio de seu enunciado. Os scripts aqui utilizados esto
disponveis na pgina da disciplina, mas podem tambm ser copiados deste roteiro.
1) (0,5) Liste quais so os shells disponveis em seu sistema e explique como os encontrou.
2) (0,5) Mostre por meio de um exemplo concreto como se faz para incluir novos caminhos na
varivel PATH caso o shell utilizado seja o C shell (csh). Execute seu exemplo para confirmar (em um
ambiente C shell, obviamente) e documente no relatrio.
3) (0,5) Seja um shell script denominado prog. Imediatamente aps o incio de sua execuo atravs
da seguinte linha de comando:
$progle27feecunicampcampinassopaulobrasilamricadosul

quais so os valores assumidos pelas seguintes variveis: $0, $2, $4, $8, $$, $#, $* e $@ ? Explique o
porqu de cada um destes valores.
5) Documente cada linha dos scripts abaixo por meio de comentrios colocados frente de cada uma
delas. Cada comentrio deve ser iniciado com o sinal # e deve explicar clararmente o que est sendo
feito na respectiva linha.
(a) (0,5) menu (veja na Tabela 3 o uso do comando de redireo <<)
#!/bin/sh
echomenu
stop=0
whiletest$stopeq0
do
echo
cat<<FIMDOMENU
1:imprimeadata
2,3:imprimeodiretoriocorrente
4:fim
FIMDOMENU
echo
echo'opcao?'
readop
echo
case$opin
1)date;;
2|3)pwd;;
4)stop=1;;
*)echo'opcaoinvalida!';;
esac
done

(b) (0,5) folheto


#!/bin/sh
case$#in
0)set`date`;m=$2;y=$6;
case$min
Feb)m=Fev;;
Apr)m=Abr;;
May)m=Mai;;
Aug)m=Ago;;
Sep)m=Set;;

Copyright 2015 DCA/FEEC/UNICAMP

11

Roteiro da disciplina EA872

Atividade 1

Oct)m=Out;;
Dec)m=Dez;;
esac;;
1)m=$1;set`date`;y=$6;;
*)m=$1;y=$2;;
esac
case$min
jan*|Jan*)m=1;;
fev*|Fev*)m=2;;
mar*|Mar*)m=3;;
abr*|Abr*)m=4;;
mai*|Mai*)m=5;;
jun*|Jun*)m=6;;
jul*|Jul*)m=7;;
ago*|Ago*)m=8;;
set*|Set*)m=9;;
out*|Out*)m=10;;
nov*|Nov*)m=11;;
dez*|Dez*)m=12;;
[19]|10|11|12);;
*)y=$m;m="";;
esac
/usr/bin/cal$m$y

(c) (0,5) path


#!/bin/sh
forDIRPATHin`echo$PATH|sed's/://g'`
#Consulteomanualdosed!
do
if[!d$DIRPATH]
then
if[f$DIRPATH]
then
echo"$DIRPATHnaoediretorio,eumarquivo"
else
echo"$DIRPATHnaoexiste"
fi
fi
done

(d) (1,0) classifica


#!/bin/sh
case$#in
0|1|[39])echoUso:classificaarquivo1arquivo21>&2;exit2;;
esac
total=0;perdida=0;
whilereadnovalinha
do
total=`expr$total+1`
case"$novalinha"in
*[AZaz]*)echo"$novalinha">>$1;;
*[09]*)echo"$novalinha">>$2;;
'<>')break;;
*)perdida=`expr$perdida+1`;;
esac
done
echo"`expr$total1`linha(s)lida(s),$perdidalinha(s)naoaproveitada(s)"

6) (1,0) traps Explique o funcionamento do script traps. Para entender o funcionamento deste script,
execute o mesmo em background (usando o operador &), liste o diretrio para encontrar um
arquivo criado pelo script, o qual informa seu PID, execute um kill conforme o especificado
abaixo e explique o que acontece.
$traps&
$ls

Copyright 2015 DCA/FEEC/UNICAMP

12

Roteiro da disciplina EA872

Atividade 1

$kill<PID>
$ls
Repita o procedimento com kill 2 <PID> e kill 15 <PID> e explique o que ocorreu.
(contedo do script traps)
#!/bin/sh
ARQUIVO=arq.$$
touch$ARQUIVO
trap"echo'AlgumprocessoenviouumTERM'1>&2;rmf$ARQUIVO;exit;"15
trap"echo'AlgumprocessoenviouumINT'1>&2;rmf$ARQUIVO;exit;"2
whiletrue
do
#Espera5segundos
sleep5
done

7) (1,0) subspar Consultando (i) a tabela 6, (ii) a seo sobre combinao de comandos (logo abaixo
da tabela 6) e (iii) o manual para o comando test, explique as sadas produzidas pelo programa
subspar quando as seguintes linhas de comando so executadas.
$subspar
$subsparsprjmgesdfprmtms

(contedo do arquivo subspar)


#!/bin/sh

testn"$1"&&param1=$1
testn"$2"&&param2=$2
testn"$3"&&param3=$3
testn"$4"&&param4=$4
echo"1resultadodoteste:${param1rs}comparam1=$param1
echo"2resultadodoteste:${param2=pa}comparam2=$param2
echo"3resultadodoteste:${param3+to}comparam3=$param3
echo "4 resultado do teste:${param4?Quarto parmetro no iniciado}
comparam4=$param4

8) (1,0) Explique como funciona o script abaixo, mostrando qual sua utilidade prtica e detalhando
cada uma das operaes.
#!/bin/sh
testd$HOME/lixo||mkdir$HOME/lixo
test0eq"$#"&&exit1;
case$1in
l)ls$HOME/lixo;;
r)case$#in
1)aux=$PWD;cd$HOME/lixo;rmrf*;cd$aux;;
*)echopro_lixo:Usoincorreto;;
esac;;
*)foriin$*
do
iftestf$i
thenmv$i$HOME/lixo
elseechopro_lixo:Arquivo$inaoencontrado.
fi
done;;
esac

9) (1,0) Explique como funciona o script abaixo, mostrando qual sua utilidade prtica e detalhando
cada um dos comandos.
#!/bin/sh
if[$#eq0]

Copyright 2015 DCA/FEEC/UNICAMP

13

Roteiro da disciplina EA872

Atividade 1

then
set$PWD
fi
forARGin$*
do
case$ARGin
prof=*)
PROFUNDIDADE=`echo$ARG|cutf2d'='`
;;
*)
if[d$ARG]
then
CONT=${PROFUNDIDADE=0}
while[$CONTgt0]
do
echon""
CONT=`expr$CONT1`
done
echo"+$ARG"
cd$ARG
forNAMEin*
do
treeprof=`expr$PROFUNDIDADE+1`$NAME
done
else
if[f$ARG]
then
CONT=${PROFUNDIDADE=0}
while[$CONTgt0]
do
echon""
CONT=`expr$CONT1`
done
echo"$ARG"
fi
fi
;;
esac
done

10)(2,0) Implemente em Bourne Shell ou Bash um script que executa um comando passado como
argumento. Este script deve suportar as seguintes opes: - -repeticoes=N, que indica que o
comando passado como argumento deve ser executado N vezes, e - -atraso=M, que indica que um
atraso de M segundos deve ser efetuado antes da primeira execuo e entre as demais execues.
Seu script deve tentar casar as opes acima no incio dos argumentos. Assim que algo no for
casado como as duas opes acima, deve-se interpretar todo o restante dos argumentos como o
comando a ser executado. Sugesto: utilize case e shift. Caso alguma das duas opes no seja
passada, estabelecer os valores default 1 para repeties e 0 para atraso usando recursos
similares aos usados no script subspar mais acima.
Atividade extra opcional: ganhar um ponto extra quem fizer e documentar a atividade opcional
abaixo.
11) (1,0) Implemente em Bourne Shell ou Bash um script recursivo (o script chama a si mesmo) que
deve ler um valor do terminal e calcular o fatorial deste valor. O script deve indicar um erro se o
valor lido for negativo. Explique o funcionamento de seu script e d alguns exemplos de
execuo que explorem todas as possibilidades, incluindo situaes de erro de entrada e de
clculo acima das possibilidades do computador. O script deve usar recursos da linguagem de
shell e no recorrer a comandos ou programas em outras linguagens.

Copyright 2015 DCA/FEEC/UNICAMP

14