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 1 Questes 2 Respostas
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 Inverso dos parmetros de entrada . . . . . . . . . . . . . . . . . . . . . . Quadrado dos parmetros de entrada . . . . . . . . . . . . . . . . . . . . . Mltiplos de um dado nmero inferior a 100 . . . . . . . . . . . . . . . . . Lista de cheiros com uma determinada extenso . . . . . . . . . . . . . . Funes Mnimo, Mximo e Mdia . . . . . . . . . . . . . . . . . . . . . . Converso de segundos para o formato h:m:s . . . . . . . . . . . . . . . . . Cpia de segurana de conjunto de directrios . . . . . . . . . . . . . . . . Menu com operaes aritmticas . . . . . . . . . . . . . . . . . . . . . . . . Ping para todos os endereos de uma rede . . . . . . . . . . . . . . . . . .

ii 1 2
2 3 3 4 5 6 6 7 8

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 3 4 4 4 4 5 6 6 7 8

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Respostas

Apresenta todos os parmetros de entrada por ordem inversa

2.1 Inverso dos parmetros de entrada


#! / b i n / b a s h #

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 de

acesso

ao

array da script os parmetros

N # nmero A # array

parmetros para

auxiliar

receber

inicializao "N =$#" " I =1"

das

variveis

let let
#

atribui V

parmetros $@ ;

ao

array

auxiliar

let let done


#

for

in

do

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

mostra ((

parmetros ; $ I >0

por ; I

ordem ))

inversa

for do

I=$N

printf done exit


0

"%d \ n "

" $ {A [ $ I ] } "

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

1 2 3 4 5 6 7 8 9 10 11
V i n $@ ; do # para l e t "X=$V$V" # obtm p r i n t f "%s \ n " "$X" done #! / b i n / b a s h # Apresenta o quadrado de cada parmetro inteiro

d e c l a r e i for

cada o

valor

passado

como

parmetro

quadrado

exit

Para cada parmetro de entrada calcula o seu quadrado x2 .

2.3 Mltiplos de um dado nmero inferior a 100

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# testa validade do parmetro : inteiro positivo #! / b i n / b a s h # mostra os mltiplos de um dado nmero inferiores a 100

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

I =0 RESTO

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13
# mostra F nome de cada ficheiro # obtm lista de ficheiros #! / b i n / b a s h # lista todos os ficheiros com extenso . sh no directrio actual

declare for do in

FICS= ` l s

. sh `

$FICS

printf done exit


0

"%s \ n "

" $F "

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

i n . sh
"%s \ n " " $F "

printf done

1 2 3 4

for do

in

$( ls

. sh )
" $F "

printf done

"%s \ n "

1 2 3 4

for do

in

` ls

. sh `
" $F "

printf done

"%s \ n "

2.5

Funes Mnimo, Mximo e Mdia

2.5 Funes Mnimo, Mximo e Mdia

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
min max $N1 $N1 $N2 $N2 ; ; #! / b i n / b a s h # l 2 nmeros inteiros e calcula : o mximo , o mnimo , e a mdia

d e c l a r e i

MIN M X N1 A

N2

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


}

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
}

then

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 "
}

" $1 "

" $2 "

" $INT "

"$DEC"

r e a d p

"N1 :

"

N1

r e a d p
$?" $?"

"N2 :

"

N2

let let

"MIN = "M X = A

printf printf exit

" Mnimo(%d ,%d)=%d \ n " " Mximo(%d ,%d)=%d \ n " $N1 $N2 # mostra

" $N1 " " $N1 " a

" $N2 " " $N2 " no

"$MIN" "$MAX" formato x.x

mostra_media

mdia

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 2 3 4 5 6 7 8 9 10 11 12 13
#! / b i n / b a s h

d e c l a r e i

HORAS MINUTOS SEGUNDOS TOTALSEGS=0

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 " \
"$TOTALSEGS" "$HORAS" "$MINUTOS" "$SEGUNDOS"

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

1 2 3 4 5 6 7 8 9 10 11
#! / b i n / b a s h # # faz para backup o dos directrios " backup " indicados como parmetros

directrio

for

in

$@

find tar

"$D"

done

c p f rm f "$D" .

mtime +15 ! type X "$D" . l i s t a "$D"


lista

do

d |

p r i n t
(

>

"$D" . l i s t a tar xf

cd

backup ;

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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
2) 3) 4) 5) 6) 7) 0) # MAIN #! / b i n / b a s h

d e c l a r e i

N1=0

N2=0 RES O C O P A =1

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
}

until

((

$OPCAO = = 0 ;

))

menu

case

let

do

"O C O P A =$ ? "

$OPCAO

in
" Nmero " Nmero 1: 2: " " N1 N2

1)

r e a d p r e a d p
;;

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 ; ;
;;

esac done

exit

RESPOSTAS

2.9 Ping para todos os endereos de uma rede

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#! / b i n / b a s h # Faz ping para todos os endereos IP numa rede 24 bits

d e c l a r e i d e c l a r e i echo exit else echo fi while do if


[

C N A O T =0 X=1

if

$#

l e
0

then xxx . xxx . xxx "

" Usar :

$0

"Incio

do

teste . . . "

$X

l t
1 =

255

ping [

c
$?

" $ 1 . $X" > 0 ];

res . txt

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

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

then

$CONTA

postos . "

Você também pode gostar