Baixe o app para aproveitar ainda mais
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
Compartilhar