Escolar Documentos
Profissional Documentos
Cultura Documentos
por
TECNOLOGIAS
do Curso Tecnolgico de Informtica
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
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
N # nmero A # array
parmetros para
auxiliar
receber
das
variveis
let let
#
atribui V
parmetros $@ ;
ao
array
auxiliar
for
in
do
mostra ((
parmetros ; $ I >0
por ; I
ordem ))
inversa
for do
I=$N
"%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
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
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
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
"%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
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 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 "
"$DEC"
r e a d p
"N1 :
"
N1
r e a d p
$?" $?"
"N2 :
"
N2
let let
"MIN = "M X = A
" Mnimo(%d ,%d)=%d \ n " " Mximo(%d ,%d)=%d \ n " $N1 $N2 # mostra
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
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
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.
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" .
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
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
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
C N A O T =0 X=1
if
$#
l e
0
" Usar :
$0
"Incio
do
teste . . . "
$X
l t
1 =
255
ping [
c
$?
res . txt
then
$CONTA
postos . "