Baixe o app para aproveitar ainda mais
Prévia do material em texto
08/05/2014 1 CCT0042 Programação para Servidores Programação Script - 03 Adaptado do Prof. Paulo Estevam Prof. Márcio Rodrigo Semestre Letivo: 2014.1 pág. � Unidade III – Programação Script ◦ 3.16 – Expansão aritmética estilo C/C++ � O duplo parêntesis (( )) ◦ 3.17 – Argumentos de linha de comando � Argumentos posicionais e variáveis especiais � Passando argumentos para outro script � O comando shift ◦ 3.18 – Teste condicional � O comando test � Teste com colchetes ◦ 3.19 – Estruturas condicionais de controle de fluxo � O comando if (se) � Estrutura condicional simples � Estrutura condicional composta � Aninhamento com elif � Operadores de testes condicionais � Operadores relacionais � Operadores de teste de arquivo � Operadores lógicos � O comando case (escolha/caso) � Estrutura condicional implícita 2 08/05/2014 2 pág. O duplo parênteses (( )) � � � Similar ao comando let, o ((...)) permite construir uma expansão aritmética, bem como um teste lógico. É uma construção e também um mecanismo para permitir o estilo C/C++ de manipulação de variáveis no Bash. Exemplos: Obs.: Tanto (( )) como let retornam um status de saída ($?). 3 pág. � � � � É possível passar um ou mais argumentos para um script. Os argumentos são passados através da linha de comando (no momento da sua execução), separados por um espaço. São conhecidos como parâmetros ou “argumentos posicionais”. Sintaxe: nome_do_script arg_1 arg_2 ... argu_n 4 08/05/2014 3 Variável DescriçãodoArgumento $$ Identificação do processo do script(PID). $# Quantidade de argumentos passados para os cript. $@ Todos os argumento passados para o script. $* Todos os argumento passados para o script. $0 Nome do script. $1 Primeiro argumento passado para o script. $2 Segundo argumento passado para o script. $3,...,${10},... Terceiro argumento passado e assim por diante. pág. Argumentos posicionais e variáveis especiais � As variáveis especiais $@, $#, $* $0, $1,...,${99} fazem referência aos argumentos posicionais passados ao script. Obs.: A partir do décimo argumento, a referência deve ser feita utilizando chaves. 5 pág. Exemplo: Criar e testar o script (args) descrito abaixo. 6 08/05/2014 4 pág. Exemplo da diferença entre $@ e $* Crie o script abaixo: file <nome> � este comando exibe informação sobre o tipo de um arquivo. Se estiver vazio, exibe “empty”. Se for um diretório, exibe “directory”. 7 pág. Exemplo da diferença entre $@ e $* (continuação) Crie 2 arquivos com nomes com espaços: Rode o script assim: ou dessa outra forma: Conclusão: O $@ reconhece os dois arquivos passados como parâmetros. 8 08/05/2014 5 pág. Exemplo passando argumentos para outro script Criar e testar os scripts (arg1 e arg2) descritos a seguir: 9 pág. arg1 10 08/05/2014 6 pág. arg2 11 pág. O comando shift � O shift desloca os argumentos posicionais para a esquerda, removendo o primeiro da lista. � � � � � Assim, $2 passa a ser $1, $3 passa a ser $2 e assim sucessivamente. Automaticamente o valor da variável $# é decrementado. O comando shift e não afeta parâmetro $0 que contém sempre o nome do script. O deslocamento para a esquerda é de uma posição, podendo ser de mais de uma, se especificado. Normalmente o comando shift é usado com estruturas de repetição. 12 08/05/2014 7 pág. Exemplo: Crie uma cópia do script args com o nome args2 e altere-a para: 13 pág. O comando test � É um comando interno do bash que retorna um valor verdadeiro (0) ou falso (1), dependendo do resultado da expressão avaliada. Não é uma estrutura condicional de controle de fluxo, mas é utilizado na sua implementação. 14 08/05/2014 8 pág. � � Sintaxe: test <expressão> Sintaxes de <expressão>: operador arg ou arg1 operador arg2 Onde: ◦ operador � pode ser um operador de teste de arquivo, relacional, lógico. ◦ arg � um operando ou expressão. Exemplo: 15 pág. � � � � � � � Teste com colchetes [ ou [ ] ou [[ ]] O [ é um comando interno considerado como sinônimo para o comando test. Versões recentes de shells exigem o colchete de fechamento. O [ avalia seus argumentos como uma expressão condicional até encontrar o ]. O duplo [ ] é outra forma variante do comando [ (test). Os duplos [[ ]] é uma extensão mais versátil do [ ] (test), a fim de se evitar erros de uso de operadores lógicos, bem como permitir expansão de expressões regulares, porém não é padrão POSIX. Exemplo: Os operadores &&, ||, <, e > funcionam dentro de um teste com [[ ]], ao contrário de [ ]. O Bash considera os [[ ]] como sendo palavras chaves. Sintaxes: [ <expressão> ou [ <expressão> ] ou [[ <expressão> ]] Obs.: Deve-se usar um espaço após e antes do colchete. 16 08/05/2014 9 pág. O comando if � das outras linguagens, o if do shell não testaDiferente condição. � � � O if verifica se o resultado do estado de saída de um comando test é verdadeiro (0) ou falso (1). Portanto, o que o comando if faz é “testar” a variável $?. Lembre-se que se a execução do último comando qualquer foi bem sucedida ou se o resultado do comando test ( [ ] ) tiver sido verdadeiro, a variável $? terá valor zero, caso contrário seu valor será diferente de zero ou 1 (falso). 17 pág. � Sintaxe: � � � Onde <condição> é uma expressão relacional ou lógica entre colchetes. Obedecer à forma x[xcondiçãox]x, onde x corresponde a um espaço. É o colchete [ que invoca o comando test e o colchete ], que delimita o fim, não é necessário em versões antigas de shells. if [ scondição ] then comandos fi ou if [ condição ] ; then comandos ... fi if test <condição> then comandos fi ou if test <condição> ; then comandos ... fi 18 08/05/2014 10 pág. Estrutura condicional simples � if ... then if [ condição ] then comandos (se condição verdadeira) fi 19 pág. Estrutura condicional composta � if ... then ... else if [ condição ] then comandos (se condição verdadeira) else comandos (se condição falsa) fi 20 08/05/2014 11 pág. Estrutura condicional composta aninhada if [ condição1 ] then if [ condição2 ] then comandos else comandos fi else if [ condição3 ] then comandos else comandos fi fi 21 pág. Aninhamento com elif (senão se � else if ) if [ condição1 ] then comandos elif [ condição2 ] then comandos elif [ condição3 ] then comandos else comandos fi 22 08/05/2014 12 Operador Descriçãoeminglês Descriçãoem português -eq Equal Igual -ne Notequal Diferente -gt Greaterthan Maiordoque -ge Greaterthanorequal Maiorouigual -lt Lessthan Menordoque -le Lessthanorequal Menorouigual pág. Operadores relacionais Utilizado pelo comando test na comparação entre variáveis ou valores do tipo inteiro: 23 Operador Descriçãoemportuguês = Igual != Diferente > Maior do que < Menor do que -z String nula (sem conteúdo) -n String não nula pág. Operadores relacionais Utilizado pelo comando test na comparação entre strings: 24 08/05/2014 13 pág. Observação: � Nas expressões de testes dentro dos colchetes, as variáveis que contém strings com espaços devem também estar entre aspas. variavel1=“Este script” variavel2=“testa strings” if [ “$variavel1” != “$variavel2” ] if [ $variavel1 = $variavel2 ] 25 pág. Exemplos de comparação entre inteiros: if [ 3 -eq 5 ] if [ “$num1” -ne “$num2” ] if [ “$num1” -ge 5 ] 26 08/05/2014 14 pág. Exemplos de comparação entre strings:if [ “$nome_arq1” = “$nome_arq2” ] (se são iguais) if [ “$data1” != “$data2” ] (se são diferentes) if [ -z “$nome_arq1” ] (se é nula) if [ -n “$nome_arq1” ] (se não é nula) 27 pág. Exemplos de comparação entre strings: if [ “$nome_arq1” = “$nome_arq2” ] (se são iguais) if [ “$data1” != “$data2” ] (se são diferentes) if [ -z “$nome_arq1” ] (se é nula) if [ -n “$nome_arq1” ] (se não é nula) 28 08/05/2014 15 pág. Operadores de teste de arquivo Usados em testes com arquivos ou diretórios: Operador Descrição em português -d -f -e -s -r -x -w -nt -ot -ef É um diretório É um arquivo normal (não é diretório) O arquivo existe É um arquivo não vazio É um arquivo somente leitura (read-only) É um arquivo executável É um arquivo gravável É um arquivo mais recente (Newer than) É um arquivo mais antigo (Older than) É o mesmo arquivo (Equal file) 29 pág. Exemplos de testes com arquivos e diretórios: if [ -s “$arquivo” ] (arquivo não vazio) if [ -f “$arquivo” ] (é um arquivo normal) if [ -d “$arquivo” ] (é um diretório) if [ -w “$arquivo” ] (arq. com permissão gravação) if [ -r “$arquivo” ] (arquivo read-only) if [ -x “$arquivo” ] (arquivo executável) 30 08/05/2014 16 OPERADOR DESCRIÇÃO && e(para avaliar duas condições) || ou(para avaliar duas condições) -a e(para avaliar uma condição) -o ou(para avaliar uma condição) ! não(tanto faz) pág. Operadores lógicos Utilizado pelo comando test para combinar expressões relacionais/lógicas: 31 pág. Exemplos de testes com operadores lógicos if [ -f $arquivo –o –d $arquivo ] (uma condição) if [ -f $arquivo ] || [ -d $arquivo ] (duas condições) if [ -f $arquivo –a –s $arquivo ] 32 08/05/2014 17 pág. O comando case case $variavel in padrão1) comando comando;; padrão2) comando comando;; padrãoN) comando comando;; *) comando_default comando_default;; esac � � É similar ao comando switch da linguagem C , sendo, porém, útil para o casamento strings ou padrões de cadeias de caracteres, por intermédio de expressões regulares. O código é executado até encontrar o terminador “;;”. A ausência dele causa erro. 33 pág. � No comando case, podemos usar os caracteres abaixo, a fim de criar padrões de cadeias de caracteres. OBS.: Estes recursos serão vistos de forma mais detalhada no slide sobre EXPRESSÕES REGULARES. 34 08/05/2014 18 pág. Exemplo 1: case $opcao in 1) echo “Você escolheu a opcao 1” ;; 2) echo “Você escolheu a opcao 2” ;; *) echo “Opção inválida!” ;; esac 35 pág. Exemplo 2: 36 08/05/2014 19 pág. Exemplo 3: 37 pág. Exemplo 4: 38 08/05/2014 20 pág. � A versão 4.0 do Bash introduziu dois novos terminadores de bloco no comando case: ◦ ;;& Se o bloco de comandos for finalizado com este terminador, o script não sairá do case e continuará testando os próximos padrões. ◦ ;& Se o bloco de comandos for finalizado com este terminador, o script não sairá do case e executará o próximo bloco sem, sequer, testar o seu padrão. 39 pág. Exemplo 5: Advanced Bash-Scripting Guide - Chapter 37. Bash, versions 2, 3, and 4 <http://tldp.org/LDP/abs/html/bashver4.html> case "$1" in [[:print:]] ) echo $1 é um caractere imprimível;;& # O terminador ;;& testará o próximo padrão [[:alnum:]] ) echo $1 é um carac. alfa/numérico;;& [[:alpha:]] ) echo $1 é um carac. alfabético ;;& [[:lower:]] ) echo $1 é uma letra minúscula ;;& [[:digit:]] ) echo $1 é um caractere numérico ;& # O terminador ;& executará o próximo bloco... %%%@@@@@ ) echo "************************" ;; # ^^^^^^^^ ... mesmo com um padrão maluco. esac 40 08/05/2014 21 pág. � � Executando o exemplo 5 passando 3 como parâmetro: 3 é um caractere imprimível 3 é um carac. alfa/numérico 3 é um caractere numérico Executando o exemplo 5 passando m como parâmetro : m m m m é é é é um caractere imprimível um carac. alfa/numérico um carac. alfabético uma letra minúscula � Executando o exemplo 5 passando / como parâmetro : / é um caractere imprimível 41 pág. Estrutura condicional implícita � É uma construção, obtida apenas com o uso de comandos ou testes lógicos, em que se consegue o desvio do fluxo de execução de comandos sem o uso do if. && � “e” || � “ou”� � Lembrando: Sintaxe: <comandos> && <se_sucesso_execute_esses_comando_tambem> <comandos> || <mesmo_se_insucesso_execute_esses_tambem> <teste_condic> && <se_sucesso_execute_esses_comando_tambem> <teste_condic> || <mesmo_se_insucesso_execute_esses_tambem> Pode-se usar parênteses ou chaves para agrupar (<comando>) && (<se_sucesso_execute_esse_comando_tambem>) (<comando>) || (<mesmo_se_insucesso_execute_esse_tambem) 42 08/05/2014 22 pág. Exemplo 1: 43 pág. Exemplo 2: 44 08/05/2014 23 pág. Exemplo 3: Este script equivale ao exemplo anterior, sem a execução de teste condicional, apenas de comando Fornecendo o mesmo resultado 45 pág. � � Nos exemplos anteriores pudemos observar que o shell não avalia as duas expressões. O que ocorre é o seguinte: ◦ O shell avalia a primeira expressão; � Caso o operador seja "E", se der um erro ele não perde tempo avaliando a segunda expressão; � Se for operador "OU" o shell só irá avaliar a segunda expressão em caso de erro na primeira, porque se der sucesso não haverá motivo para avaliar a segunda. Lembre-se: ( ) ou { } permite o agrupamento de comandos. Com os parênteses os comandos são executados por um subshell. Com as chaves os comandos são executados no shell corrente, além de exigir o delimitador “;” após o último comando, bem como espaços antes e depois das chaves. 46
Compartilhar