Programação de Scripts
Prof. Kleber Rezende
kleber.rezende@ifsuldeminas.edu.br
O que é o shell?
O Shell pode ser definido como o interpretador
de instruções e comandos.
Quando o usuário ou sistema executa qualquer
comando, o Shell é responsável pela correta 'interpretação' deste.
O "prompt" do Shell é a linha de comando do
Unix e Linux, que recebe os comandos digitados pelo usuário para serem executados.
O que é o shell?
Além dos comandos básicos para navegar entre
diretórios e manipular arquivos, ele também possui todas as estruturas de uma linguagem de programação, como IF, FOR, WHILE, variáveis e funções. Com isso, também é possível usar o shell para fazer scripts e automatizar tarefas.
Shell Script
Um script é um arquivo que guarda vários
comandos e pode ser executado sempre que preciso. Os comandos de um script são os mesmos que se digita no prompt.
Por exemplo, se de tempos em tempos você
quiser saber informações do sistema como
horário, ocupação do disco e os usuários que estão logados, é preciso digitar três comandos:
prompt# date prompt # df prompt # w
• É melhor fazer um script chamado "sistema" e colocar estes comandos nele. O conteúdo do arquivo "sistema" seria o seguinte:
#!/bin/bash date
E para chamar este script, basta agora executar apenas um comando:
prompt # ./sistema
Isso é um shell script. Um arquivo de texto que contém comandos do sistema e pode ser executado pelo usuário.
IMPORTANTE: Antes de executar um script, você deve torná-lo um arquivo executável
Melhorando o código do script
Com o tempo, o script vai crescer, mais
comandos vão ser adicionados e quanto maior, mais difícil encontrar o ponto certo onde fazer a alteração ou corrigir algum erro.
Para poupar horas de estresse, e facilitar as
manutenções futuras, é preciso deixar o código visualmente mais agradável e espaçado, e colocar comentários esclarecedores.
Melhorando o código do script
#!/bin/bash
# sistema - Script que mostra informações sobre o sistema # Autor: Fulano da Silva
# O date mostra a data e a hora correntes echo "Data e Horário:"
date echo
# O df mostra as partições e quanto cada uma ocupa no disco echo "Uso do disco:"
df echo
# O w mostra os usuários que estão conectados nesta máquina echo "Usuários conectados:"
Melhorando o código do script
Para adicionar um comentário, basta iniciar a
linha com um "#" e escrever o texto do comentário em seguida.
Estas linhas são ignoradas pelo shell durante a
execução.
O cabeçalho com informações sobre o script e
seu autor também é importante para ter-se uma visão geral do que o script faz, sem precisar analisar todo o código.
Variáveis
As variáveis são a base de qualquer script. É
dentro delas que os dados obtidos durante a execução do script serão armazenados.
Para definir uma variável, basta usar o sinal de
igual "=" e para ver seu valor, usa-se o comando echo.
Variáveis
prompt$ VARIAVEL="um dois tres" prompt$ echo $VARIAVEL
um dois tres
prompt$ echo $VARIAVEL $VARIAVEL um dois tres um dois tres
Variáveis
Não podem haver espaços ao redor do igual "=" Também é possível armazenar a saída de um
comando dentro de uma variável.
Ao invés de aspas, o comando deve ser colocado
entre "$(...)";
E finalmente, o comando "unset" apaga uma
Variáveis
prompt$ HOJE=$(date)
prompt$ echo "Hoje é: $HOJE"
Hoje é: Sáb Abr 24 18:40:00 BRT 2004 prompt$ unset HOJE
prompt$ echo $HOJE prompt$
Expressões aritméticas
O shell também sabe fazer contas. A construção
usada para indicar uma expressão aritmética é "$((...))", com dois parênteses.
prompt$ echo $((2*3)) 6
prompt$ echo $((2*3-2/2+3)) 8
prompt$ NUM=44
prompt$ echo $((NUM*2)) 88
prompt$ NUM=$((NUM+1)) prompt$ echo $NUM
Expressões aritméticas
Há também a opção do comando let, também
para número inteiros:
Expressões aritméticas
#!/bin/bashecho “Entre com dois números:” read A read B let C=0 let C=A+B echo "Resultado:" echo $C
Expressões aritméticas
Para calcular expressões com números reais,
devemos usar a sintaxe mostrada no exemplo abaixo:
Onde “scale=2” significa duas casas após a vírgula. O pipe bc “|bc” significa que estamos usando a
calculadora do sistema.
A="5.5" B="2.2"
Exercícios
1. Faça um script que leia nome, curso, disciplina e as três notas de um aluno. Na saída será exibido o nome e a média do aluno.
2. Faça um script que leia um valor em centímetros e mostre o mesmo valor em metros.
3. Faça um script que mostre a eficiência de um jogador em um treino de pênaltis. Para isso leia quantas tentativas e quantos acertos.
4. Faça um script que leia o nome, cargo e salário de um funcionário. Dê um aumento de 34.5% a este funcionário. Mostre o salário antigo, o atual e a diferença entre eles.
5. Faça um script que calcule o tempo gasto em uma viagem de carro. Para isso entre com a distância que será percorrida e a velocidade média em que o carro correrá.
6. Faça um script que calcule o consumo de combustível de um carro em uma viagem. Para isso entre com a autonomia do carro (km/litro) e a distância que será percorrida.
Recebimento de opções e parâmetros
Assim como os comandos do sistema que
possuem opções e parâmetros, os scripts também podem ser preparados para receber dados via linha de comando.
Dentro do script, algumas variáveis especiais são
definidas automaticamente, por exemplo: "$1" contém o primeiro argumento recebido na linha de comando, "$2" o segundo, e assim por diante.
Recebimento de opções e parâmetros
O acesso é direto, basta referenciar a variável que
o valor já estará definido.
Assim é possível criar scripts que tenham opções
como --help, --version e outras.
Além disso, existem outras variáveis especiais:
Variável Especial Significado
$# Mostra a quantidade de parâmetros que foram passados para o script.
$* Lista todos os parâmetros passados para o script
$? Mostra se o último comando foi executado com sucesso ou não, sendo que retorna o valor 0 como sucesso e o valor 1 como erro.
Recebimento de opções e parâmetros
#!/bin/bash
# argumentos - mostra o valor das variáveis especiais
echo "O nome deste script é: $0" echo "Recebidos $# argumentos: $*"
echo "O primeiro argumento recebido foi: $1" echo "O segundo argumento recebido foi: $2"
Recebimento de opções e parâmetros
prompt$ ./argumentos um dois três O nome deste script é: ./argumentos Recebidos 3 argumentos: um dois três O primeiro argumento recebido foi: um O segundo argumento recebido foi: dois
O comando test
O canivete suíço dos comandos do shell é o
"test", que consegue fazer vários tipos de testes em números, textos e arquivos. Ele possui várias opções para indicar que tipo de teste será feito, algumas delas:
O comando test
prompt$ ./testa-arquivos Digite o arquivo: /naoexiste
O arquivo '/naoexiste' não foi encontrado
prompt$ ./testa-arquivos Digite o arquivo: /tmp /tmp é um diretório
prompt$ ./testa-arquivos
Digite o arquivo: /etc/passwd
Tente fazer o script "testa-arquivos", que pede ao
usuário para digitar um arquivo e testa se este arquivo existe. Se sim, diz se é um arquivo ou um diretório. Exemplo de uso:
O comando test
prompt$ ./relacao.sh 3 5 3 é menor que 5 prompt$ ./relacao.sh 5 3 5 é maior que 3 prompt$ ./relacao.sh 5 5 5 é igual a 5 prompt$ Faça um script que receba dois números como
parâmetro e mostre a relação entre eles. Exemplo:
O comando test
#!/bin/bash
echo "entre com 2 números reais" read n1
read n2
r=$(echo "$n1 >= $n2" | bc)
echo $r
test "$r" -eq "0" && echo "$n1 < que $n2" test "$r" -ne "0" && echo "$n1 >= que $n2"
Para fazer comparações com números reais o
comando test não é recomendado.
A Estrutura Condicional if
Diferente de outras linguagens, o if testa um
comando e não uma condição.
Porém como já conhecemos qual o comando do
shell que testa condições, é só usá-lo em conjunto com o if.
Por exemplo, para saber se uma variável é maior
ou menor do que 10 e mostrar uma mensagem informativa na tela, pode-se fazer assim:
A Estrutura Condicional if
if test "$VARIAVEL" -gt 10 then
echo "é maior que 10" else
echo "é menor que 10" fi
A Estrutura Condicional if
if [ "$VARIAVEL" -gt 10 ] then
echo "é maior que 10" else
echo "é menor que 10" fi
Há um atalho para o test , que é o comando [.
Ambos são exatamente o mesmo comando, porém usar o [ deixa o if mais parecido com o formato tradicional de outras linguagens:
Obs.: Se usar o [, também é preciso fechá-lo com o ], e sempre
A Estrutura Condicional if
if expressão1 && expressão2 then
comandos else
comandos fi
Você pode utilizar os operadores lógicos && (E) e
|| (OU) para montar suas expressões lógicas.
if expressão1 || expressão2 then
comandos else
A Estrutura Condicional if
if [ “$1” –gt 10 ] && [ “$1” –lt 70 ] then
echo “Dentro do intervalo [10..70]” else
echo “Fora do intervalo [10..70]” fi
A Estrutura Condicional if
if expressão1 then comandos else if expressão2 then comandos fi Você pode ainda utilizar estruturas if aninhadas,
lembrando que para cada if deve existir um fi, indicando o fim da estrutura.
if expressão1 then
comandos
elif expressão2 then
A Estrutura Condicional if
if [ “$1” –ge 6 ] then echo “APROVADO” else if [ “$1” –ge 3 ] then echo “RECUPERAÇÃO” else echo “REPROVADO” fi fi Exemplo:Comando Case
case "$variavel" in
texto1) comandos que serão executados;; texto2) comandos que serão executados;; texto3) comandos que serão executados;; esac
O comando CASE executa uma ação caso o
conteúdo de uma variável seja igual a um determinado valor exato.
Ele é usado da seguinte forma:
Repare que após as listas de comandos a serem executados existem sempre ";;".
Comando Case
echo "Digite Oi, Tchau, Amor ou Odiar"
read texto
case "$texto" in Oi)
echo "Oi! Tudo bom?" ;;
Tchau)
echo "Tchau. Até Mais!" ;;
Amor) echo "Eu amo você";;
Odiar) echo "Eu não odeio você";;
*) echo "Você não digitou nenhuma das opções";;
esac
Comando Case
if [ "$texto" = "Oi" ] then
echo "Oi! Tudo bom?"
elif [ "$texto" = "Tchau" ] then
echo "Tchau. Até Mais!" elif [ "$texto" = "Amor" ] then
echo "Eu amo você"
elif [ "$texto" = "Odiar" ] then
echo "Eu não odeio você" else