shell script - controle de fluxo
DESCRIPTION
Aula sobreTRANSCRIPT
Fundamentos de Programação Aplicada a Redes Shell ScriptControle de Fluxo
Frederico MadeiraLPIC1, LPIC2, [email protected]
✔ 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
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
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
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
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)
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
#!/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
#!/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
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
#!/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
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
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 ->
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
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:
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 ->
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
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
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
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
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
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
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
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
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
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
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
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
Fundamentos de Programação Aplicada a Redes Shell ScriptControle de Fluxo
Frederico MadeiraLPIC1, LPIC2, [email protected]