Você está na página 1de 12

Bash

(Exerccios de Aplicao)
por

Antnio Arajo de Oliveira

Exerccios resolvidos de apoio disciplina de

TECNOLOGIAS
do Curso Tecnolgico de Informtica

Seco de Informtica,
Departamento de Matemtica, Informtica e Contabilidade (MIC)

Escola Secundria de Barcelos


Setembro de 2006

Contedo
Lista de Listagens

ii

1 Questes

2 Respostas

2.1

Inverso dos parmetros de entrada . . . . . . . . . . . . . . . . . . . . . .

2.2

Quadrado dos parmetros de entrada . . . . . . . . . . . . . . . . . . . . .

2.3

Mltiplos de um dado nmero inferior a 100 . . . . . . . . . . . . . . . . .

2.4

Lista de cheiros com uma determinada extenso . . . . . . . . . . . . . .

2.5

Funes Mnimo, Mximo e Mdia

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

2.6

Converso de segundos para o formato h:m:s . . . . . . . . . . . . . . . . .

2.7

Cpia de segurana de conjunto de directrios . . . . . . . . . . . . . . . .

2.8

Menu com operaes aritmticas . . . . . . . . . . . . . . . . . . . . . . . .

2.9

Ping para todos os endereos de uma rede . . . . . . . . . . . . . . . . . .

Listagens
codigo/ex01invpar.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex02quadpar.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex03multiplos.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex04listext_a.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex04listext_b.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex04listext_c.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex04listext_d.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex05funcs.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex06horas.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex07backdirs.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex08aritmetica.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

codigo/ex09pingall.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

ii

Questes
1. Escreva uma script que apresente na consola todos os parmetros que lhe forem
passados na linha de comandos por ordem inversa. (R: seco 2.1)
2. Escreva uma script que apresente na consola o quadrado dos parmetros que lhe
forem passados na linha de comandos. Os parmetros devem ser valores numricos.
(R: seco 2.2)
3. Escreva uma script que dado um nmero inferior a 100 como parmetro apresente
na consola a listagem de todos os nmeros que so seus multiplos e inferiores a 100.
(R: seco 2.3)
4. Escreva uma script que apresente na consola a listagem de todos os cheiros com
uma determinada extenso. (R: seco 2.4)
5. Escreva uma script que faa a leitura de 2 nmeros inteiros e apresente na consola
os respectivos valores mximo, mnimo e mdia. Estes 3 valores devem ser obtidos
atravs de funes, considerando que a mdia deve ser calculada numa funo sem
retorno (procedimento). (R: seco 2.5)
6. Escreva uma script que faa a leitura de um nmero de segundos e apresente a hora
correspondente no formato h:m:s. (R: seco 2.6)
7. Escreva uma script que receba como parmetros um conjunto de directrios e que
faa o respectivo backup para um directrio com este nome, de todos os cheiros
acedidos h menos de 15 dias. (R: seco 2.7)
8. Escreva uma script que apresente um menu com opes para leitura de 2 nmeros, e
as operaes aritmticas: soma,subtrao, multiplicao, diviso, resto da diviso e
expoente, e uma opo de sada. A opo escolhida deve ser validada. O programa
deve apresentar o menu depois de cada operao at que seja seleccionada a opo
de sada. (R: seco 2.8)
9. Escreva uma script que dado um endereo de rede no formato xxx.xxx.xxx, faa

ping para todos os endereos dessa rede e informe se cada endereo est activoou
no. (R: seco 2.9)

RESPOSTAS

Respostas

2.1 Inverso dos parmetros de entrada




#! / b i n / b a s h

Apresenta

todos

os

parmetros

de

entrada

por

ordem

inversa

3
4
5
6

d e c l a r e i
d e c l a r e i
d e c l a r e a

ndice

de

acesso

N # nmero

de

parmetros

A #

array

auxiliar

ao

para

array
da

script

receber

os

parmetros

7
8
9
10

inicializao

let
let

das

variveis

"N=$#"
" I =1"

11
12
13
14
15
16

atribui

for

let
let
done

parmetros

in

$@

ao

array

auxiliar

por

ordem

inversa

do

"A [ $ I ]=$V"
" I++"

17
18
19
20
21
22

mostra

for
do

((

parmetros

I=$N

printf
done

$ I >0

"%d \ n "

))

" $ {A [ $ I ] } "

23
24

exit

O acesso sequencial aos parmetros de entrada, tendo em conta que o nmero destes
desconhecido partida, s pode ser obtido atravs da varivel $@, logo necessria a
utilizao da estrutura for in. Como o acesso aos parmetros s pode ser feito na ordem
normal, necessrio copiar os parmetros para um array e, depois, aceder a estes partindo
do ltimo elemento do array e indo at ao primeiro elemento.

2.2

Quadrado dos parmetros de entrada

2.2 Quadrado dos parmetros de entrada




#! / b i n / b a s h

Apresenta

d e c l a r e i

quadrado

de

cada

parmetro

cada

valor

inteiro

3
4
5
6
7
8
9

for

V i n $@ ; do
# para
l e t "X=$V$V" # obtm
p r i n t f "%s \ n " "$X"
done

passado

como

parmetro

quadrado

10
11

exit

Para cada parmetro de entrada calcula o seu quadrado x2 .

2.3 Mltiplos de um dado nmero inferior a 100





1

#! / b i n / b a s h

mostra

os

mltiplos

de

um

dado

nmero

inferiores

100

3
4
5

d e c l a r e i
d e c l a r e i

I =0
RESTO

6
7
8
9
10
11
12
13
14
15
16
17
18

testa

validade

do

parmetro :

inteiro

positivo

i f [ [ $ 1 g t 0 ] ]
then
w h i l e ( ( I++ < 1 0 0 ) ) ; do
l e t "RESTO=I%$ 1 " # r e s t o da d i v i s o
i f t e s t "$RESTO" n e 0 # s e d i f e r e n t e d e 0
then c o n t i n u e 1
# p a s s a ao s e g u i n t e
e l s e p r i n t f "%d \ n " " $ I " # s e n o m l t i p l o
fi
done
e l s e p r i n t f " I n d i c a r um p a r m e t r o i n t e i r o . \ n "
fi

19
20

exit

O nmero dado como parmetro usado como quociente para todos os nmeros
inferiores a 100. Sempre que o resto da diviso der 0 o valor exibido na consola.

RESPOSTAS

2.4 Lista de cheiros com uma determinada extenso




#! / b i n / b a s h

lista

todos

os

ficheiros

# obtm

lista

de

ficheiros

com

extenso

. sh

no

directrio

actual

3
4
5

declare

FICS= ` l s

. sh `

6
7
8
9
10
11

mostra

for
do

nome

in

printf
done

de

cada

ficheiro

$FICS

"%s \ n "

" $F "

12
13

exit

A lista de cheiros com a extenso pretendida obtida atravs da execuo do comando ls. Em seguida usada a estrutura for in para aceder a cada nome individualmente e o exibir na consola.
Seguem-se outras solues possveis baseadas no mesmo princpio e correspondentes
s linhas 5 a 11 da listagem anterior.

1
2
3
4

for
do

printf
done

2
3
4

for
do

2
3
4

in

printf
done

" $F "


$( ls

. sh )

"%s \ n "

" $F "


1

"%s \ n "


1

i n . sh

for
do

in

printf
done


` ls

. sh `

"%s \ n "

" $F "

2.5

Funes Mnimo, Mximo e Mdia

2.5 Funes Mnimo, Mximo e Mdia




#! / b i n / b a s h

nmeros

inteiros

calcula :

mximo ,

mnimo ,

mdia

3
4

d e c l a r e i

MIN MAX N1

N2

10

f u n c t i o n min ( ) {
i f [ $ 1 \< $ 2 ]
then r e t u r n $ 1
e l s e r e t u r n $2
fi

11

6
7
8
9

12

18

f u n c t i o n max ( ) {
i f [ $ 1 g e $ 2
r e t u r n $1
else
r e t u r n $2
fi

19

13
14
15
16
17

then

20

26

f u n c t i o n mostra_media ( ) {
d e c l a r e i INT RESTO DEC
l e t "INT=( $ 1+$ 2 ) / 2 "
l e t "RESTO=( $ 1+$ 2 )%2 "
l e t "DEC=$RESTO 1 0 / 2 "
p r i n t f " Mdia(%d ,%d)=%d.%d \ n "

27

21
22
23
24
25

" $1 "

" $2 "

" $INT "

"$DEC"

28
29

r e a d p

"N1 :

"

N1

r e a d p

"N2 :

"

N2

30
31

min

$N1

$N2

32

max

$N1

$N2

let
let

"MIN =

$?"

"MAX =

$?"

33

35

printf
printf

36

mostra_media

34

" Mnimo(%d ,%d)=%d \ n "

" $N1 "

" $N2 "

"$MIN"

" Mximo(%d ,%d)=%d \ n "

" $N1 "

" $N2 "

"$MAX"

$N1

$N2 #

mostra

mdia

no

formato

x.x

37
38

exit

Reparar que como no possvel trabalhar com nmeros reais, a forma de resolver a
questo consistiu em separar a parte inteira e a parte decimal do resultado correspondente
mdia recorrendo ao operador aritmtico que d o resto da diviso (%).

RESPOSTAS

2.6 Converso de segundos para o formato h:m:s



1

#! / b i n / b a s h

2
3

d e c l a r e i

HORAS MINUTOS SEGUNDOS TOTALSEGS=0

10

r e a d p " Q u a n t o s s e g u n d o s ? " TOTALSEGS


l e t "HORAS=$TOTALSEGS / 3 6 0 0 "
l e t "SEGUNDOS=$TOTALSEGS % 3 6 0 0 "
l e t "MINUTOS=$SEGUNDOS / 6 0 "
l e t "SEGUNDOS=$SEGUNDOS % 6 0 "
p r i n t f "%d s e g s = %d:%d:%d h o r a s \ n " \

11

"$TOTALSEGS"

5
6
7
8
9

"$HORAS"

"$MINUTOS"

"$SEGUNDOS"

12
13

exit

Este um exemplo muito simples de clculo de aritmtico, que faz a converso de


uma determinada grandeza para outra. Reparar na declarao mltipla de variveis com
inicializao de uma delas, na linha 3 da script.

2.7 Cpia de segurana de conjunto de directrios




#! / b i n / b a s h

faz

para

backup
o

dos

directrios

directrio

indicados

como

parmetros

" backup "

4
5

for

in

$@

find

c p f
rm f "$D" .
tar

8
9

do

mtime +15 ! type


X "$D" . l i s t a "$D"

"$D"

d
|

p r i n t
(

cd

>

"$D" . l i s t a

backup ;

tar

xf

lista

done

10
11

exit

O comando find,na linha 7, obtm a lista de cheiros acedidos h menos de 15 dias,


colocando-a num cheiro cujo nome consiste no nome do directrio respectivo seguido
da extenso .lista. Na linha 8, os cheiros seleccionados so compactados e o cheiro
resultante passado ao directrio backup onde descompactado. Na linha 9, o cheiro
auxiliar comalista de cheiros seleccionados removido.

2.8

Menu com operaes aritmticas

2.8 Menu com operaes aritmticas



1

#! / b i n / b a s h

2
3

d e c l a r e i

N1=0

N2=0 RES OPCAO=1

23

f u n c t i o n menu ( ) {
d e c l a r e OPC=" x "
echo " MENU "
echo " 1 L e r o p e r a n d o s "
echo " 2 Soma"
echo " 3 S u b t r a c o "
echo " 4 M u l t i p l i c a o "
echo " 5 D i v i s o "
echo " 6 R e s t o da D i v i s o "
echo " 7 E x p o n e n c i a o "
echo " 0 S a i r "
echo ""
u n t i l ( ( $OPC != " x " ) ) ; do
r e a d p " Opo : " OPC
c a s e $OPC i n
[0 7])
r e t u r n $OPC ; ;
) l e t "OPC=x " ; ;
esac
done

24

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

25
26

# MAIN

27

until

((

28

menu

29

case

30

$OPCAO == 0
;

let

))

do

"OPCAO=$ ? "

$OPCAO

in

1)

r e a d p
r e a d p

31
32
33

" Nmero

1:

"

N1

" Nmero

2:

"

N2

;;

40

0)

l e t "RES=N1 + N2" ; echo " $N1 + $N2 = $RES" ; ;


l e t "RES=N1 N2" ; echo " $N1 $N2 = $RES" ; ;
l e t "RES=N1 N2" ; echo " $N1 $N2 = $RES" ; ;
l e t "RES=N1 / N2" ; echo " $N1 / $N2 = $RES" ; ;
l e t "RES=N1 % N2" ; echo " $N1 % $N2 = $RES" ; ;
l e t "RES=N1 N2" ; echo " $N1 ^ $N2 = $RES" ; ;
echo " Fim d e p r o g r a m a . " ; e x i t 0 ; ;

41

;;

34

2)

35

3)

36

4)

37

5)

38

6)

39

7)

42
43

esac
done

44
45

exit

RESPOSTAS

2.9 Ping para todos os endereos de uma rede




#! / b i n / b a s h

# Faz

ping

para

todos

os

endereos

3
4
5

d e c l a r e i
d e c l a r e i

CONTA=0
X=1

6
7
8
9
10
11
12

if

l e

$#

echo
exit
else
echo
fi

" Usar :

then

$0

xxx . xxx . xxx "

"Incio

do

teste . . . "

13
14
15

while
do

$X

16

ping

17

if

18
19
20
21
22
23
24

c
$?

l t
1
=

255

" $ 1 . $X" >


0

];

res . txt

then

echo " $ 1 . $X e s t l i g a d o "


l e t "CONTA=$CONTA+1"

fi
l e t "X=$X+1"
done
echo " R e s p o n d e r a m
exit 0

$CONTA

postos . "

IP

numa

rede

24

bits

Você também pode gostar