O documento discute comandos e estruturas de controle de fluxo em shell script como exit, if/else, test, case e loops for. Ele fornece exemplos de como usar essas estruturas para verificar condições, realizar tarefas repetitivas e tomar decisões no fluxo de execução de um script.
2. 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/bash
echo “Teste exit code” Retornará 0 indicando que o comando foi ok.
echo $?
lskdf # Comando desconhecido Retornará um valor diferente de 0 indicando
echo $? um erro
exit 113 # Irá retornar 113 para o shell.
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
3. Condicionais: TEST e IF
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”
4. Condicionais: TEST e IF
Exemplo 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
5. Condicionais: TEST e IF
Exemplo 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
6. 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)
7. Condicionais: TEST e IF
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
8. Condicionais: TEST e IF
Resposta: Script idade.sh
#!/bin/bash
echo "------------------------------------------------------" if [ "$SEXO" = "M" ]
echo -n "Qual sua idade ? " then
read IDADE echo "Sexo Masculino"
echo -n "Qual seu sexo [M/F]? " else
read SEXO echo "Sexo Feminino"
echo -n "Qual é seu nome de usuário ? " fi
read USUARIO
echo "------------------------------------------------------" if [ -d "/home/$USUARIO" ]
echo"" then
echo "Você possui o home: /home/$USUARIO"
if [ $IDADE -ge 18 ] else
then echo "Você nao possui um home neste sistema"
echo "Você é MAIOR de idade"; fi
else
echo "Você é MENOR de idade"; exit 0
fi
9. Condicionais: TEST e IF
Resposta: Script idade.sh
#!/bin/bash
echo "------------------------------------------------------"
echo -n "Qual sua idade ? "
read IDADE
echo -n "Qual seu sexo [M/F]? "
read SEXO
echo -n "Qual é seu nome de usuário ? "
read USUARIO
echo "------------------------------------------------------"
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
10. Condicionais: TEST e IF
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.
11. Condicionais: TEST e IF
Resposta: Script backup.sh
#!/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"
if [ -e “$OUT_DIR/$BKP_FILE” ]
then
echo "Realizando backup do sistema...."
echo “arquivo existe”
cd $OUT_DIR
else
tar cvfz $BKP_FILE $DIRS
echo “arquivo não existe”
fi
If [ “$?” != 0 ]
then
echo “Falha na execução do Backup”
else
echo “Backup executado com sucesso”
fi
12. Condicionais: CASE
Permite a comparação de uma variável com muitos valores
Sintaxe:
case $VALOR in
1)
echo “Você escolheu 1”
;;
2)
echo “Você escolheu 2”
;;
*)
echo “Você não escolheu nem 1 e nem 2”
;;
esac
13. 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 ->
14. Condicionais: CASE
Exemplo::
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
15. 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 discos
2) Status da Memória do sistema
3) Informações sobre o Processador
4) Endereço IP
5) Quem está logado no sistema
ENTRE COM A OPÇÃO DESEJADA:
16. 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ário
read OPCAO Continua ->
17. Condicionais: CASE
Script sysinfo2.sh
# Trata a opção escolhida pelo usuário
case $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
18. 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 1
Comando 2
Comando 3
....
done
20. 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 $ARQUIVOS
do
echo "O arquivo é: $LISTA"
done
21. 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 $LISTA
do
echo "O arquivo é: $ARQ"
done
22. 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
24. 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.br
Www.uol.com.br
Www.linux.com
Www.fedoraproject.og
Www.terra.com.br
www.jc.com.br
Dica: Faça verificação do exit code de cada comando ping
26. 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ário
Valide se o diretório informado existe ou não
Dicas:
$* - Lista dos Argumentos passados
$# - Quantidade de argumentos passados
$1 - Primeiro Argumento
$2 – Segundo Argumento
27. 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 DIR
else
# entra aqui se for passada algum parametro
DIR=$1
fi
28. 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
done
else
# Nao é um diretório válido
echo "O diretório informado não existe"
exit 127
fi