Buscar

Aula09 Repeticao Shift

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 33 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 33 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 33 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Programação	
  para	
  Servidores	
  
Aula	
  09	
  
Sumário	
  
•  Variáveis	
  especiais:	
  	
  	
  $# $* $@ 
•  Estruturas	
  de	
  repe<ção:	
  for,	
  while	
  e	
  until;	
  
•  Comando	
  shift;	
  
•  Exercícios.	
  
2	
  
Variáveis	
  $# $* $@ 
•  $#	
   fornece	
  o	
  número	
  total	
  de	
  argumentos	
  passados	
  
para	
  o	
  shell	
  script;	
  
•  $*	
   representa	
  todos	
  os	
  argumentos	
  passados	
  em	
  
uma	
  única	
  string;	
  
•  $@	
   	
  representa	
  todos	
  os	
  argumentos	
  passados	
  
strings	
  separadas;	
  
•  A	
  principal	
  diferença	
  entre	
  $*	
  e	
  $@	
  é	
  que	
  a	
  segunda	
  
preserva	
  eventuais	
  espaços	
  em	
  branco	
  embu<dos	
  
dentro	
  dos	
  argumentos	
  (exemplo	
  adiante);	
  
3	
  
Variáveis	
  $# $* $@ 
•  Resposta	
  do	
  exercício	
  2	
  da	
  Aula	
  08:	
  
case "$1" in 
 a) echo "$2 + $3 = $(($2 + $3))" ;; 
 s) echo "$2 - $3 = $(($2 - $3))" ;; 
 m) echo "$2 * $3 = $(($2 * $3))" ;; 
 d) echo "$2 / $3 = $(($2 / $3))" ;; 
 *) echo "Operação inválida" ;; 
esac 
4	
  
Variáveis	
  $# $* $@ 
•  Resposta	
  do	
  exercício	
  2	
  da	
  Aula	
  08	
  (usando	
  $#):	
  
if [ $# -ne 3 ]; then 
 echo "Passe os argumentos como abaixo:" 
 echo "Uso: t.sh <operador> <num1> <num2>" 
 exit 1 
fi 
case "$1" in 
 a) echo "$2 + $3 = $(($2 + $3))" ;; 
 s) echo "$2 - $3 = $(($2 - $3))" ;; 
 m) echo "$2 * $3 = $(($2 * $3))" ;; 
 d) echo "$2 / $3 = $(($2 / $3))" ;; 
 *) echo "Operação inválida" ;; 
esac 
5	
  
Estruturas	
  de	
  repe<ção 
•  São	
  blocos	
  de	
  código	
  que	
  têm	
  sua	
  execução	
  repe<da	
  
enquanto	
  uma	
  determinada	
  condição	
  for	
  verdadeira;	
  
•  Em	
  programação	
  shell	
  script,	
  temos	
  3	
  diferentes	
  
estruturas	
  de	
  repe<ção:	
  
– for 
– while 
– until	
  
6	
  
Comando	
  for 
•  Interage	
  sobre	
  uma	
  lista	
  de	
  objetos,	
  executando	
  o	
  
bloco	
  de	
  comandos	
  para	
  cada	
  objeto;	
  
– Objetos	
  podem	
  ser	
  qualquer	
  coisa	
  em	
  forma	
  de	
  lista;	
  
•  Exemplos:	
  
–  a b c d	
  (objetos:	
  letras	
  a,	
  b,	
  c,	
  d);	
  
–  $1 $2 $3	
  (objetos:	
  valores	
  dos	
  três	
  primeiros	
  
argumentos); 
–  "$var1" "$var2" "$var3" "$var4"	
  (objetos:	
  os	
  valores	
  
das	
  variáveis	
  var1,	
  var2,	
  var3,	
  e	
  var4);	
  
–  *.txt (objetos:	
  todos	
  os	
  arquivos	
  com	
  extensão	
  txt);	
  
–  $@ (objetos:	
  todos	
  os	
  argumentos	
  passados	
  para	
  o	
  script); 
7	
  
Comando	
  for 
•  Exemplo	
  1:	
  
# imprime na tela os valores das variáveis 
for j in "$var1" "$var2" "$var3" "$var4"; do 
 echo $j 
done 
•  Exemplo	
  2:	
  
# imprime na tela os valores 1 a 2 b 3 c d 
for k in 1 a 2 b 3 c d; do 
 echo $k 
done 
8	
  
Comando	
  for 
•  Exemplo	
  3:	
  
# imprime na tela todos os arquivos .txt 
for i in *.txt; do 
 cat < $i 
done 
•  Exemplo	
  4:	
  
# imprime na tela os valores dos argumentos 
for j in "$@"; do 
 echo $j 
done 
9	
  
Comando	
  for 
•  Comparando	
  $*	
  e	
  $@:	
  
# imprime na tela os valores dos argumentos 
for j in $@; do 
 echo $j 
done 
echo "-----------------" 
# imprime na tela os valores dos argumentos 
for j in $*; do 
 echo $j 
done 
10	
  
Comando	
  for 
•  Comparando	
  $*	
  e	
  $@:	
  
# imprime na tela os valores dos argumentos 
for j in $@; do 
 echo $j 
done 
echo "-----------------" 
# imprime na tela os valores dos argumentos 
for j in $*; do 
 echo $j 
done 
11	
  
$ ./aula09_sl08.sh p1 p2 "É teste" outro parâmetro 
p1 
p2 
É 
teste 
outro 
parâmetro 
----------------- 
p1 
p2 
É 
teste 
outro 
parâmetro 
Comando	
  for 
•  Comparando	
  "$*"	
  e	
  "$@":	
  
# imprime na tela os valores dos argumentos 
for j in "$@"; do 
 echo $j 
done 
echo "-----------------" 
# imprime na tela os valores dos argumentos 
for j in "$*"; do 
 echo $j 
done 
12	
  
Comando	
  for 
•  Comparando	
  "$*"	
  e	
  "$@":	
  
# imprime na tela os valores dos argumentos 
for j in "$@"; do 
 echo $j 
done 
echo "-----------------" 
# imprime na tela os valores dos argumentos 
for j in "$*"; do 
 echo $j 
done 
13	
  
$ ./aula09_sl10.sh p1 p2 "É teste" outro parâmetro 
p1 
p2 
É teste 
outro 
parâmetro 
----------------- 
p1 p2 É teste outro parâmetro 
$ ./aula09_sl10.sh p1 p2 "É teste" outro parâmetro 
p1 
p2 
É teste 
outro 
parâmetro 
----------------- 
p1 p2 É teste outro parâmetro 
Comando	
  for 
•  Comparando	
  "$*"	
  e	
  "$@":	
  
# imprime na tela os valores dos argumentos 
for j in "$@"; do 
 echo $j 
done 
echo "-----------------" 
# imprime na tela os valores dos argumentos 
for j in "$*"; do 
 echo $j 
done 
14	
  
Preservou	
  a	
  estrutura	
  
dos	
  parâmetros	
  
Comando	
  for 
•  Exemplo	
  5:	
  receber	
  alguns	
  valores	
  como	
  argumento	
  
e	
  imprimir	
  na	
  tela	
  os	
  quadrados	
  desses	
  valores.	
  Se	
  
nenhum	
  valor	
  for	
  passado,	
  imprimir	
  mensagem	
  de	
  
erro:	
  
if [ "$#" -lt 1 ]; then 
 echo "Deve passar pelo menos um parâmetro!!" 
 exit 1; 
fi 
for j in "$@"; do 
 echo $j ao quadrado é igual a $((j * j)) 
done 
15	
  
Comando	
  for 
•  Outras	
  formas	
  de	
  for:	
  
for i in {2..8}; do 
 echo "$i" 
done 
for i in {0..10..2}; do 
 echo "$i" 
done 
16	
  
Comando	
  for 
•  Outras	
  formas	
  de	
  for:	
  
for i in {2..8}; do 
 echo "$i" 
done 
for i in {0..10..2}; do 
 echo "$i" 
done 
17	
  
Imprime	
  os	
  
números	
  2,	
  3,	
  4,	
  5,	
  
6,	
  7	
  e	
  8	
  
Comando	
  for 
•  Outras	
  formas	
  de	
  for:	
  
for i in {2..8}; do 
 echo "$i" 
done 
for i in {0..10..2}; do 
 echo "$i" 
done 
18	
  
Imprime	
  os	
  
números	
  entre	
  0,	
  2,	
  
4,	
  6,	
  8	
  e	
  10	
  	
  
Comando	
  while 
•  O	
  while	
  testa	
  uma	
  condição	
  no	
  início	
  do	
  laço	
  e	
  fica	
  
em	
  loop	
  enquanto	
  essa	
  condição	
  for	
  verdadeira	
  
– Ao	
  contrário	
  do	
  laço	
  for,	
  o	
  while	
  é	
  u<lizado	
  em	
  
situações	
  onde	
  o	
  número	
  de	
  repe<ções	
  do	
  laço	
  não	
  é	
  
conhecido	
  de	
  antemão.	
  	
  
•  Sintaxe:	
  
while condição; do 
 comando_1 
 comando_2... 
 comando_n 
done	
  
19	
  
Comando	
  while 
•  Exemplo	
  1:	
  imprimir	
  na	
  tela	
  os	
  números	
  de	
  1	
  até	
  o	
  
número	
  passado	
  como	
  parâmetro	
  pelo	
  usuário:	
  
LIMIT=$1 
a=1 
while [ "$a" -le "$LIMIT" ]; do 
 echo -n "$a " 
 let "a+=1" 
done 
20	
  
Comando	
  while 
•  Exemplo	
  2:	
  script	
  que	
  fica	
  solicitando	
  ao	
  usuário	
  que	
  
digite	
  vários	
  números	
  até	
  que	
  ele	
  entre	
  com	
  o	
  valor	
  
0.	
  Neste	
  momento,	
  imprime	
  a	
  soma	
  dos	
  números.	
  	
  
read -p "Numero (0 para sair): " num 
soma=0 
while [ $num -ne 0 ]; do 
 let "soma+=num" 
 read -p "Numero (0 para sair): " num 
done 
echo "Soma = $soma" 
21	
  
Comando	
  while 
•  Exemplo	
  3:	
  modificar	
  o	
  script	
  anterior	
  para	
  imprimir	
  a	
  
média	
  (inteira)	
  ao	
  invés	
  dasoma.	
  
read -p "Numero (0 para sair): " num 
soma=0 
cont=0 
while [ $num -ne 0 ]; do 
 let "soma+=num" 
 ((cont++)) 
 read -p "Numero (0 para sair): " num 
done 
echo "Média = $((soma/cont))" 
22	
  
Comando	
  until 
•  O	
  until	
  testa	
  por	
  uma	
  condição	
  no	
  início	
  de	
  um	
  
laço	
  e	
  fica	
  em	
  loop	
  enquanto	
  esta	
  condição	
  for	
  falsa:	
  
– Funcionamento	
  oposto	
  ao	
  while;	
  
•  Sua	
  sintaxe	
  é:	
  
until condição; do 
 comando_1 
 comando_2 
 ... 
 comando_n 
done 
23	
  
Comando	
  until 
•  Exemplo:	
  
LIMIT=$1 
var=0 
until [ "$var" -ge $LIMIT ]; do 
 echo -n "$var " 
 let "var+=1" 
done 
24	
  
Comando	
  shift 
•  O	
  comando	
  shift	
  serve	
  para	
  acessarmos	
  os	
  
parâmetros	
  passados	
  a	
  um	
  script	
  de	
  uma	
  outra	
  maneira;	
  
–  Inicialmente,	
  usamos	
  o	
  $1	
  para	
  acessar	
  o	
  primeiro	
  argumento;	
  
–  Em	
  seguida,	
  executamos	
  o	
  comando	
  shift,	
  que	
  faz	
  com	
  que	
  o	
  
primeiro	
  argumento	
  seja	
  eliminado	
  e	
  o	
  segundo	
  argumento	
  se	
  
transforme	
  no	
  primeiro;	
  
–  Agora,	
  se	
  acessarmos	
  novamente	
  o	
  argumento	
  $1,	
  
receberemos	
  o	
  valor	
  do	
  segundo	
  parâmetro;	
  
–  Pode-­‐se	
  repe<r	
  este	
  processo	
  por	
  tantas	
  vezes	
  quantos	
  forem	
  os	
  
argumentos.	
  
25	
  
Comando	
  shift 
•  Além	
  disso,	
  este	
  comando	
  pode	
  receber	
  como	
  
argumento	
  um	
  número	
  que	
  representa	
  quantos	
  
parâmetros	
  posicionais	
  queremos	
  avançar	
  (“shibar”);	
  
•  Exemplo:	
  
–  Imagine	
  que	
  você	
  tenha	
  um	
  comando	
  que	
  receba	
  10	
  
argumentos	
  e	
  execute	
  o	
  comando	
  shift 4.	
  	
  
– Neste	
  caso,	
  $4	
  se	
  torna	
  $1,	
  $5	
  se	
  torna	
  $2	
  e	
  assim	
  
sucessivamente;	
  
– Os	
  argumentos	
  $1,	
  $2	
  e	
  $3	
  originais	
  são	
  perdidos.	
  
26	
  
Comando	
  shift 
•  Se	
  o	
  argumento	
  passado	
  é	
  zero	
  ou	
  maior	
  que	
  $#,	
  os	
  
parâmetros	
  posicionais	
  não	
  se	
  alteram	
  e	
  o	
  comando	
  
não	
  tem	
  efeito	
  algum;	
  
•  Se	
  nenhum	
  argumento	
  é	
  passado,	
  assume-­‐se	
  que	
  
N=1;	
  
•  O	
  status	
  de	
  retorno	
  é	
  zero	
  a	
  menos	
  que	
  N	
  seja	
  maior	
  
que	
  $#	
  ou	
  menor	
  que	
  zero.	
  
27	
  
Comando	
  shift 
•  O	
  comando	
  shift	
  costuma	
  ser	
  usado	
  quando	
  o	
  
número	
  de	
  argumentos	
  de	
  um	
  comando	
  pode	
  variar:	
  
– P.	
  ex.:	
  quando	
  usuários	
  podem	
  passar	
  quantos	
  argumentos	
  
quiserem,	
  estes	
  argumentos	
  podem	
  ser	
  processados	
  num	
  
laço	
  while	
  com	
  a	
  condição	
  de	
  teste	
  envolvendo	
  a	
  variável	
  
$#;	
  
– Esta	
  condição	
  será	
  verdadeira	
  enquanto	
  o	
  número	
  de	
  
argumentos	
  ($#)	
  for	
  maior	
  que	
  zero;	
  
– Todos	
  os	
  argumentos	
  são	
  acessados	
  pela	
  variável	
  $1	
  e	
  o	
  
comando	
  shift	
  reduz	
  o	
  número	
  de	
  argumentos	
  a	
  cada	
  
iteração.	
  	
  
– Quando	
  $#	
  se	
  torna	
  zero	
  o	
  laço	
  while	
  termina;	
  
28	
  
Comando	
  shift 
•  Exemplo	
  1:	
  imprime	
  todos	
  os	
  argumentos	
  passados	
  
while [ "$#" -gt 0 ]; do 
 echo "$1" 
 shift 
done 
•  Exemplo	
  2:	
  imprime	
  metade	
  dos	
  argumentos	
  passados	
  
while [ "$#" -gt 0 ]; do 
 echo "$1" 
 shift 2 
done 
29	
  
Exercícios	
  
•  Fazer	
  os	
  seguintes	
  scripts:	
  
1.  Imprimir	
  os	
  números	
  ímpares	
  de	
  17	
  até	
  5;	
  
2.  Modifique	
  o	
  script	
  do	
  exemplo	
  2	
  do	
  comando	
  while	
  
para	
  que	
  imprima	
  uma	
  mensagem	
  de	
  erro	
  caso	
  o	
  usuário	
  
digite	
  o	
  valor	
  0	
  já	
  na	
  primeira	
  tenta<va;	
  
3.  Receber	
  um	
  número	
  inteiro	
  como	
  parâmetro	
  calcular	
  e	
  
imprimir	
  o	
  fatorial	
  deste	
  número.	
  Se	
  o	
  número	
  menor	
  
que	
  0,	
  imprime	
  mensagem	
  de	
  erro.	
  
30	
  
Exercícios	
  
4.  Listar	
  todos	
  os	
  arquivos	
  e	
  diretórios	
  da	
  pasta	
  atual	
  no	
  
formato	
  abaixo:	
  
1- agenda.txt - arquivo comum; 
2- aulas - diretório; 
3- teste1.sh - executável; 
4- teste2.sh - executável; 
– Dica:	
  use	
  uma	
  variável	
  para	
  guardar	
  o	
  retorno	
  do	
  comando	
  
ls	
  e	
  depois	
  faça	
  um	
  for	
  para	
  percorrer	
  todos	
  os	
  
arquivos.	
  
31	
  
Estudo	
  dirigido	
  
•  Leitura	
  dos	
  itens	
  6.1.2.2	
  e	
  6.4	
  do	
  livro:	
  
“Classic	
  Shell	
  Scrip<ng”	
  
32	
  
Próxima	
  aula...	
  
•  Comandos	
  internos;	
  
•  Desenvolvimento	
  de	
  scripts	
  mais	
  elaborados;	
  
•  Exercícios;	
  
33

Outros materiais