Shell Script - Controle de fluxo
Upcoming SlideShare
Loading in...5
×
 

Shell Script - Controle de fluxo

on

  • 2,757 views

Aula sobre

Aula sobre

Statistics

Views

Total Views
2,757
Views on SlideShare
2,694
Embed Views
63

Actions

Likes
1
Downloads
65
Comments
0

2 Embeds 63

http://www.madeira.eng.br 53
http://madeira.eng.br 10

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Shell Script - Controle de fluxo Shell Script - Controle de fluxo Presentation Transcript

  • Fundamentos de Programação Aplicada a Redes ­ Shell ScriptControle de Fluxo Frederico Madeira LPIC­1, LPIC­2, CCNA fred@madeira.eng.br www.madeira.eng.br
  • Saída e Código de Saída✔ O comando utilizado para terminar um script é o exit✔ Ele pode ser utilizado para retornar um valor✔ Todo comando retorna um status ✔ Se finalizado com sucesso o exit code é 0 ✔ Se finalizado com falha, o exit code é um valor numérico diferente de zero#!/bin/bashecho “Teste exit code” Retornará 0 indicando que o comando foi ok.echo $?lskdf # Comando desconhecido Retornará um valor diferente de 0 indicandoecho $? um erroexit 113 # Irá retornar 113 para o shell.Por convenção, os comandos retornam 0 para indicar sucesso ouretornam um valor diferente de zero para indicar um erro ou umacondição de erro
  • Condicionais: TEST e IFTeste Condicional – IFif [ “$NOME” = “Fred” ]then echo “Seja bem vindo Fred”else echo “Acesso não Permitido”fiTeste Condicional – TESTtest “CONDIÇÃO” && echo “Condição verdadeira” || echo “Condição falsa” View slide
  • Condicionais: TEST e IFExemplo IF: #!/bin/bash echo -n "Digite seu primeiro nome: " read NOME if [ “$NOME” = “Fred” ] then echo “Seja bem vindo $NOME” else echo “Acesso não Permitido” exit 127 fi exit 0 View slide
  • Condicionais: TEST e IFExemplo TEST: #!/bin/bash echo “Verificação do sistema, devo prosseguir [s/n] ?” read RESPOSTA test “$RESPOSTA” = “n” && exit 2 echo "bla bla bla" exit 0
  • Condicionais: TEST e IF Testes em arquivos Testes em variáveis -b é um dispositivo de bloco -c é um dispositivo de caractere Comparação Numérica -d é um diretório -lt é menor que (LessThan) -e o arquivo existe -gt é maior que (GreaterThan) -f é um arquivo normal -le é menor igual (LessEqual) -g o bit SGID está ativado -ge é maior igual (GreaterEqual)-G o grupo do arquivo é o do usuário atual -eq é igual (EQual) -k o sticky-bit está ativado -ne é diferente (NotEqual) -L o arquivo é um link simbólico-O o dono do arquivo é o usuário atual Comparação de Strings -p o arquivo é um named pipe “=” é igual -r o arquivo tem permissão de leitura != é diferente -s o tamanho do arquivo é maior que zero -n é não nula-S o arquivo é um socket -z é nula -t o descritor de arquivos N é um terminal -u o bit SUID está ativado Operadores Lógicos-w o arquivo tem permissão de escrita ! NÃO lógico (NOT) -x o arquivo tem permissão de execução -a E lógico (AND)-nt o arquivo é mais recente (NewerThan) -o OU lógico (OR)-ot o arquivo é mais antigo (OlderThan)-ef o arquivo é o mesmo (EqualFile)
  • Condicionais: TEST e IFPrática: Script idade.shEscreva um script que pergunte sua idade, pergunte seu sexo e seu nomede usuário neste sistema.Informar:- É maior de idade ?- Seu sexo é masculino ou feminino ?- Possui um diretório home neste servidor ?PS: Faça duas versões, uma usando if e outra usando test
  • Condicionais: TEST e IFResposta: Script idade.sh#!/bin/bashecho "------------------------------------------------------" if [ "$SEXO" = "M" ]echo -n "Qual sua idade ? " thenread IDADE echo "Sexo Masculino"echo -n "Qual seu sexo [M/F]? " elseread SEXO echo "Sexo Feminino"echo -n "Qual é seu nome de usuário ? " firead USUARIOecho "------------------------------------------------------" if [ -d "/home/$USUARIO" ]echo"" then echo "Você possui o home: /home/$USUARIO"if [ $IDADE -ge 18 ] elsethen echo "Você nao possui um home neste sistema" echo "Você é MAIOR de idade"; fielse echo "Você é MENOR de idade"; exit 0fi
  • Condicionais: TEST e IF Resposta: Script idade.sh#!/bin/bashecho "------------------------------------------------------"echo -n "Qual sua idade ? "read IDADEecho -n "Qual seu sexo [M/F]? "read SEXOecho -n "Qual é seu nome de usuário ? "read USUARIOecho "------------------------------------------------------"echo""test $IDADE -ge 18 && echo "Você é MAIOR de idade" || echo "Você é MENOR de idade"test "$SEXO" = "M" && echo "Sexo Masculino" || echo "Sexo Feminino"test -d "/home/$USUARIO" && echo "Você possui um home: /home/$USUARIO" || echo "Você não possui um home neste sistema"exit 0
  • Condicionais: TEST e IFPrática: Script backup.shMelhore o script backup.sh desenvolvido anteriormente e informe ao finaluma mensagem informando se o backup foi concluído com sucesso e seo arquivo existe realmente no local indicado.
  • Condicionais: TEST e IF Resposta: Script backup.sh#!/bin/bashOUT_DIR=/opt/backup/HOSTNAME=$(hostname)AGORA=$(date +"%Y%m%d-%H%m")BKP_FILE="sysbkp_$HOSTNAME_$AGORA.tar.gz"DIRS="/etc /home /var/www/var/lib/mysql" if [ -e “$OUT_DIR/$BKP_FILE” ] thenecho "Realizando backup do sistema...." echo “arquivo existe”cd $OUT_DIR elsetar cvfz $BKP_FILE $DIRS echo “arquivo não existe” fiIf [ “$?” != 0 ]then echo “Falha na execução do Backup”else echo “Backup executado com sucesso”fi
  • Condicionais: CASEPermite a comparação de uma variável com muitos valoresSintaxe:case $VALOR in 1) echo “Você escolheu 1” ;; 2) echo “Você escolheu 2” ;; *) echo “Você não escolheu nem 1 e nem 2” ;;esac
  • Condicionais: CASEExemplo::#!/bin/bashecho ""echo "Escolha uma das seguintes pessoas"echo ""echo "--------------------------------"echo "1. Frederico Madeira"echo "2. Alberto Viegas"echo "3. Luciano Cabral"echo ""echo -n "Qual deles vocÊ deseja obter iformações: "read ESCOLHA Continua ->
  • Condicionais: CASEExemplo::case $ESCOLHA in 1) echo "" echo "Professor das cadeiras de Linux/Shell/SD e VoIP" echo "Email: fred@madeira.eng.br" ;; 2) echo "" echo "Professor das cadeiras de Linux/Shell/SD e Segurança" echo "Email: alviegas@gmail.com" ;; 3) echo "" echo "Professor das cadeiras de Windows/Redes Ethernet" echo "Email: lscabral@gmail.com" ;; *) echo "" echo "Qualquer outra opção cai aqui" ;;esac
  • Condicionais: CASEScript: sysinfo2.shCrie um script que exiba informações sobre o sistema. Ele deve ter a seguinteinterface:1) Espaço livre nos discos2) Status da Memória do sistema3) Informações sobre o Processador4) Endereço IP5) Quem está logado no sistemaENTRE COM A OPÇÃO DESEJADA:
  • Condicionais: CASEScript sysinfo2.sh#!/bin/bash# Exibição do Menuecho "1) Espaço Livre nos Discos"echo "2) Status da Memória do Sistema"echo "3) Informações sobre o Processador"echo "4) Endereço IP"echo "5) Quem está logado no sistema"echo ""echo -n "Escolha a opção: "# Leitura da opção do usuárioread OPCAO Continua ->
  • Condicionais: CASEScript sysinfo2.sh# Trata a opção escolhida pelo usuáriocase $OPCAO in 1) df -h ;; 2) free ;; 3) cat /proc/cpuinfo ;; 4) /sbin/ifconfig ;; 5) w ;; *) echo "Não foi escolhida uma opção válida" ;;esac
  • LOOPS: forLoop é um bloco de código que se repete para enquanto uma condiçãofor verdadeira.Sintaxe:for arg in [list]do Comando 1 Comando 2 Comando 3 ....done
  • LOOPS: forExmplo#!/bin/bash# Fazendo um loop dada uma sequência numéricafor NUMBER in 1 2 3 4 5 6 7 8 9 10do echo "O número é: $NUMBER"done
  • LOOPS: forExmplo#!/bin/bash# Fazendo um loop através de variáveisARQUIVOS="/ect/passwd/etc/crontab/etc/sysconfig/network/etc/fakefile/opt/sportclube/usr/sbin/shutdown"for LISTA in $ARQUIVOSdo echo "O arquivo é: $LISTA"done
  • LOOPS: forExmplo#!/bin/bash# Fazendo um loop através de variáveis carregadas dinamicamenteecho -n "Informe um diretório: "read DIRLISTA=$(ls $DIR)for ARQ in $LISTAdo echo "O arquivo é: $ARQ"done
  • LOOPS: forScript: file_exist.shFaça um script que verifique se a lista de arquivos abaixo existe e informe aousuário./ect/passwd/etc/crontab/etc/sysconfig/network/etc/fakefile/opt/sportclube/usr/sbin/shutdown
  • LOOPS: forScript: file_exist.sh#!/bin/bashARQUIVOS="/ect/passwd/etc/crontab/etc/sysconfig/network/etc/fakefile/opt/sportclube/usr/sbin/shutdown"for LISTA in $ARQUIVOSdo if [ -e "$LISTA" ] then echo "$LISTA existe" else echo "$LISTA não existe" fidone
  • LOOPS: forScript: ping_hosts.shSalve a lista abaixo no arquivo hosts.lst e envie 1 pacote ICMP para cada um,ao final informe se o host está ativo ou não. Ordene os hosts em ordemalfabética antes de começar a executar os pings.Www.madeira.eng.brWww.uol.com.brWww.linux.comWww.fedoraproject.ogWww.terra.com.brwww.jc.com.brDica: Faça verificação do exit code de cada comando ping
  • LOOPS: forScript: file_exist.sh#!/bin/bashLISTA=$(sort hosts.lst)for HOST in $LISTAdo ping -c 1 $HOST &> /dev/null && echo "Host $HOST estáativo" || echo "HOST $HOST está offline"done
  • LOOPS: forScript: new_ls.shEscreva um script que solicite ao usuário um diretório, informe para cadaobjeto encontrado neste diretório: - se ele é um diretório - Se é um arquivo - Se é um link, - Se for arquivo, informe se seu tamanho é maior do que zero.O diretório pode ser informado como parâmetro para o comando ou de formainterativa para o usuárioValide se o diretório informado existe ou nãoDicas:$* - Lista dos Argumentos passados$# - Quantidade de argumentos passados$1 - Primeiro Argumento$2 – Segundo Argumento
  • LOOPS: forScript: new_ls.sh#!/bin/bashif [ -z "$1" ]then # entra aqui se não for passado parâmetro echo -n "Insira o diretório desejado: " read DIRelse # entra aqui se for passada algum parametro DIR=$1fi
  • LOOPS: forif [ -d "$DIR" ]then # Se for um diretório váldio, executa LISTA=$(ls $DIR) for ARG in $LISTA do if [ -d "$DIR/$ARG" ] then echo "$ARG - Diretório" else if [ -L "$DIR/$ARG" ] then echo "$ARG - Link" else if [ -e "$DIR/$ARG" ] then echo -n "$ARG - Arquivo - " if [ -f "$DIR/$ARG" ] then echo "Arquivo maior do que zero" else echo "Arquivo zerado" fi fi fi fi doneelse # Nao é um diretório válido echo "O diretório informado não existe" exit 127fi
  • Fundamentos de Programação Aplicada a Redes ­ Shell ScriptControle de Fluxo Frederico Madeira LPIC­1, LPIC­2, CCNA fred@madeira.eng.br www.madeira.eng.br