shell script - controle de fluxo

29
Fundamentos de Programação Aplicada a Redes - Shell Script Controle de Fluxo Frederico Madeira LPIC-1, LPIC-2, CCNA [email protected] www.madeira.eng.br

Upload: frederico-madeira

Post on 25-May-2015

2.287 views

Category:

Technology


1 download

DESCRIPTION

Aula sobre

TRANSCRIPT

Page 1: Shell Script - Controle de fluxo

Fundamentos de Programação Aplicada a Redes ­ Shell ScriptControle de Fluxo

Frederico MadeiraLPIC­1, LPIC­2, [email protected]

Page 2: Shell Script - Controle de fluxo

✔ 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

Por convenção, os comandos retornam 0 para indicar sucesso ou retornam um valor diferente de zero para indicar um erro ou uma condição de erro

Saída e Código de Saída

#!/bin/bashecho “Teste exit code”echo $?

lskdf # Comando desconhecidoecho $?

exit 113 # Irá retornar 113 para o shell.

Retornará 0 indicando que o comando foi ok.

Retornará um valor diferente de 0 indicando um erro

Page 3: Shell Script - Controle de fluxo

Teste Condicional – IF

if [ “$NOME” = “Fred” ]

then

echo “Seja bem vindo Fred”

else

echo “Acesso não Permitido”

fi

Teste Condicional – TEST

test “CONDIÇÃO” && echo “Condição verdadeira” || echo “Condição falsa”

Condicionais: TEST e IF

Page 4: Shell Script - Controle de fluxo

Exemplo IF:

Condicionais: TEST e 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 127fi

exit 0

Page 5: Shell Script - Controle de fluxo

Exemplo TEST:

Condicionais: TEST e IF

#!/bin/bash

echo “Verificação do sistema, devo prosseguir [s/n] ?”read RESPOSTA

test “$RESPOSTA” = “n” && exit 2

echo "bla bla bla"

exit 0

Page 6: Shell Script - Controle de fluxo

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)

Page 7: Shell Script - Controle de fluxo

Prática: Script idade.sh

Escreva um script que pergunte sua idade, pergunte seu sexo e seu nome de 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 IF

Page 8: Shell Script - Controle de fluxo

#!/bin/bash

echo "------------------------------------------------------"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""

if [ $IDADE -ge 18 ]then

echo "Você é MAIOR de idade";else

echo "Você é MENOR de idade";fi

Condicionais: TEST e IF

if [ "$SEXO" = "M" ]then

echo "Sexo Masculino"else

echo "Sexo Feminino"fi

if [ -d "/home/$USUARIO" ]then

echo "Você possui o home: /home/$USUARIO"else

echo "Você nao possui um home neste sistema"fi

exit 0

Resposta: Script idade.sh

Page 9: Shell Script - Controle de fluxo

#!/bin/bash

echo "------------------------------------------------------"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 IF

Resposta: Script idade.sh

Page 10: Shell Script - Controle de fluxo

Prática: Script backup.sh

Melhore o script backup.sh desenvolvido anteriormente e informe ao final uma mensagem informando se o backup foi concluído com sucesso e se o arquivo existe realmente no local indicado.

Condicionais: TEST e IF

Page 11: Shell Script - Controle de fluxo

#!/bin/bash

OUT_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"

echo "Realizando backup do sistema...."cd $OUT_DIRtar cvfz $BKP_FILE $DIRS

If [ “$?” != 0 ]then

echo “Falha na execução do Backup”else

echo “Backup executado com sucesso”fi

Condicionais: TEST e IF

Resposta: Script backup.sh

if [ -e “$OUT_DIR/$BKP_FILE” ]then

echo “arquivo existe”else

echo “arquivo não existe”fi

Page 12: Shell Script - Controle de fluxo

Condicionais: CASE

Permite a comparação de uma variável com muitos valores

Sintaxe:

case $VALOR in1) echo “Você escolheu 1”;;2)echo “Você escolheu 2”;;*) echo “Você não escolheu nem 1 e nem 2”;;

esac

Page 13: Shell Script - Controle de fluxo

Condicionais: CASE

Exemplo::

#!/bin/bash

echo ""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 ->

Page 14: Shell Script - Controle de fluxo

Condicionais: CASEExemplo::

case $ESCOLHA in 1) echo "" echo "Professor das cadeiras de Linux/Shell/SD e VoIP" echo "Email: [email protected]" ;; 2) echo "" echo "Professor das cadeiras de Linux/Shell/SD e Segurança" echo "Email: [email protected]" ;; 3) echo "" echo "Professor das cadeiras de Windows/Redes Ethernet" echo "Email: [email protected]" ;; *) echo "" echo "Qualquer outra opção cai aqui" ;;esac

Page 15: Shell Script - Controle de fluxo

Condicionais: CASE

Script: sysinfo2.sh

Crie um script que exiba informações sobre o sistema. Ele deve ter a seguinte interface:

1) Espaço livre nos discos2) Status da Memória do sistema3) Informações sobre o Processador4) Endereço IP5) Quem está logado no sistema

ENTRE COM A OPÇÃO DESEJADA:

Page 16: Shell Script - Controle de fluxo

Condicionais: CASE

Script sysinfo2.sh

#!/bin/bash

# Exibição do Menu

echo "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 ->

Page 17: Shell Script - Controle de fluxo

Condicionais: CASE

Script 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

Page 18: Shell Script - Controle de fluxo

LOOPS: for

Loop é um bloco de código que se repete para enquanto uma condição for verdadeira.

Sintaxe:

for arg in [list]do

Comando 1Comando 2Comando 3....

done

Page 19: Shell Script - Controle de fluxo

LOOPS: for

Exmplo

#!/bin/bash # Fazendo um loop dada uma sequência numérica

for NUMBER in 1 2 3 4 5 6 7 8 9 10do echo "O número é: $NUMBER"done

Page 20: Shell Script - Controle de fluxo

LOOPS: for

Exmplo

#!/bin/bash # Fazendo um loop através de variáveis

ARQUIVOS="/ect/passwd/etc/crontab/etc/sysconfig/network/etc/fakefile/opt/sportclube/usr/sbin/shutdown"

for LISTA in $ARQUIVOSdo echo "O arquivo é: $LISTA"

done

Page 21: Shell Script - Controle de fluxo

LOOPS: for

Exmplo

#!/bin/bash # Fazendo um loop através de variáveis carregadas dinamicamente

echo -n "Informe um diretório: "read DIR

LISTA=$(ls $DIR)for ARQ in $LISTAdo echo "O arquivo é: $ARQ"done

Page 22: Shell Script - Controle de fluxo

LOOPS: for

Script: file_exist.sh

Faça um script que verifique se a lista de arquivos abaixo existe e informe ao usuário.

/ect/passwd/etc/crontab/etc/sysconfig/network/etc/fakefile/opt/sportclube/usr/sbin/shutdown

Page 23: Shell Script - Controle de fluxo

LOOPS: for

Script: file_exist.sh

#!/bin/bash

ARQUIVOS="/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

Page 24: Shell Script - Controle de fluxo

LOOPS: for

Script: ping_hosts.sh

Salve 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 ordem alfabé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.br

Dica: Faça verificação do exit code de cada comando ping

Page 25: Shell Script - Controle de fluxo

LOOPS: for

Script: file_exist.sh

#!/bin/bash

LISTA=$(sort hosts.lst)

for HOST in $LISTAdo ping -c 1 $HOST &> /dev/null && echo "Host $HOST está ativo" || echo "HOST $HOST está offline"done

Page 26: Shell Script - Controle de fluxo

LOOPS: for

Script: new_ls.sh

Escreva um script que solicite ao usuário um diretório, informe para cada objeto 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 forma interativa para o usuárioValide se o diretório informado existe ou não

Dicas:

$* - Lista dos Argumentos passados$# - Quantidade de argumentos passados$1 - Primeiro Argumento$2 – Segundo Argumento

Page 27: Shell Script - Controle de fluxo

LOOPS: for

Script: new_ls.sh

#!/bin/bash

if [ -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

Page 28: Shell Script - Controle de fluxo

LOOPS: for

if [ -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

Page 29: Shell Script - Controle de fluxo

Fundamentos de Programação Aplicada a Redes ­ Shell ScriptControle de Fluxo

Frederico MadeiraLPIC­1, LPIC­2, [email protected]