Exemplos de loops no Bash

Mesmo não querendo se dedicar a aprender e entender melhor os meandros da linguagem de programação de scripts Bash, pode ser útil conhecer alguns de seus conceitos.
Saber criar loops é um destes conhecimentos básicos que vale a pena adquirir.
Um pequeno script pode ajudar a poupar uma enormidade de tempo, no dia a dia de qualquer usuário, de qualquer sistema operacional.
Se achar melhor, adicione esta página aos seus favoritos (Ctrl + D), para ter uma referência rápida no futuro. 😉

Os diferentes tipos de loops do Bash

Os loops (ou laços) são expressões presentes em todas (ou quase todas) as linguagens de programação. Além disso, podem se dividir em tipos diferentes.
No Bash, você pode usar for, while e until.
Veja em que casos cada um é mais indicado:

  • for — se você tem experiência com outras linguagens de programação, no Bash, o for é um pouco diferente da maioria.
    Basicamente é usado para te permitir iterar entre uma série de palavras dentro de uma string.
  • while — executa um pedaço de código, caso a expressão de controle seja verdadeira. Ele só irá parar quando ela for falsa — ou quando encontrar um break explícito no meio do código em execução.
  • until — muito semelhante ao while, exceto pelo fato de que o código é executado enquanto a expressão de controle é falsa.

Segue alguns exemplos simples, que você pode usar para compor ou construir um código mais sofisticado, para atender melhor às suas necessidades.

Exemplos de uso do for

Você pode experimentar este código diretamente na linha de comando do sistema, como no exemplo abaixo


for i in $( ls ); do
> echo item: $i
> done

… ou pode abrir um editor e escrever o código dentro dele e gravar com algum nome. O meu, vou gravar como exemplo-for.sh:


#!/bin/bash
for i in $( ls ); do
   echo item: $i
done

Explicando o código…

  • A primeira linha informa ao sistema que o arquivo deve ser executado com o programa /bin/bash.
  • Na segunda linha declaramos a variável i como repositório dos diferentes valores contidos em $( ls ).
  • A terceira linha expõe o valor atual de i.
  • Por fim, done informa que chegamos ao final do laço for e, se não houver mais nada a ser feito, o programa para por aqui — ou segue sendo executado.

Depois de gravado, execute-o com o bash


bash exemplo-for.sh

Experimente também este script, para colorir texto:


#!/bin/bash
for fg in {30..39}
do
    echo -e "\e["$fg"m apenas um texto colorido pelos caracteres de escape do BASH."
done

vim syntax color

Como criar um loop while no Bash

Veja um exemplo simples de laço while (enquanto), no Bash:


#!/bin/bash
contador=0
while [ $contador -lt 10 ];
do
    echo O valor atual do contador é: $contador
    let contador=contador+1
done

O argumento -lt pode ser abreviatura de less than ou lower than, que significame “menos que” ou “menor que”, em uma tradução livre.
Da mesma forma, usa-se -gt, como abreviatura de greater than, para “maior que”.

Exemplo de uso do until no Bash

Se eu fosse traduzir livremente a linha until [ $contador -lt 10 ]; no exemplo abaixo, eu diria “até que (until) a variável contador seja menor que 10…”
Experimente o código e veja o resultado:


#!/bin/bash
contador=30
until [ $contador -lt 10 ];
do
    echo O valor do meu contador é igual a $contador
    let contador-=1
done

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Como realizar backup incremental no Linux, usando o comando tar

O comando tar está ligado às tarefas de gestão de backups desde sua origem.
Seu é uma referência ao dispositivo de gravação/leitura em fitas (tape drives), muito usado, ainda hoje, por sua confiabilidade e capacidade de armazenamento.
backup tape drive
Tar é abreviatura para tape archiver.

Apesar do nome, o utilitário não é restrito a qualquer tipo de mídia de gravação.
Backups feitos com o tar podem ser armazenados aonde você achar melhor.

Neste post, vamos abordar alguns usos do programa para, no final, montar um pequeno script, que você pode alterar para criar seu próprio backup automatizado ou integrar a outro script mais complexo.
Se tiver alguma dúvida, por favor, clique nos links presentes no texto para obter mais informações.
Não esqueça de dar uma olhada também na tag backup deste site e nos links da sessão de referências.

Os desafios de fazer backups eficientes

Fazer cópias de segurança de um grande volume de dados, pode tomar muito tempo.
Consome tanto tempo, que muita gente deixa de ter este cuidado — e pode se arrepender amargamente por isso.
O ideal é automatizar o processo de backup.
O processo de cópia e compressão de uma grande quantidade de arquivos também consome tempo de processamento — todo o sistema pode ficar significativamente mais lento durante a realização da tarefa.

Para não ser uma “coisa chata” na sua vida, contudo, o backup eficiente precisa ser automático e rodar em background, ou seja, ser executado nos bastidores — de preferência, em um horário em que você não esteja usando (muito) o computador.

fita cartuchos dell ultrium
O backup incremental é demorado na primeira vez em que é executado, mas é rápido nas outras execuções.
Isto ocorre por que consiste em apenas adicionar arquivos novos ou que foram alterados, desde a última vez em que foi feito. O resto é ignorado.

Como fazer o backup incremental com o comando tar

Se tiver algum dúvida extra, leia o post “9 exemplos de uso do comando tar“.
Para realizar um backup simples de um diretório no sistema rode o tar, seguido do nome desejado para o arquivo de backup e do nome do diretório a ser copiado:


tar cvf justincase-backup-2afeira.tar /home/justincase

No comando acima:

  • a opção ‘c’ indica que você deseja comprimir/copiar os arquivos do diretório para dentro de um só arquivo de backup.
  • a opção ‘v’ indica que você deseja ter feedback sobre a execução da tarefa. Você pode usar ‘vv’ ou ‘vvv’ e tornar o comando ainda mais verboso.
  • a opção ‘f’ deve preceder o nome do arquivo que vai abrigar o backup.

Há outras formas de usar este mesmo comando. As opções, por exemplo, podem ser dadas separadamente:


tar -c -v -f justincase-backup-2afeira.tar /home/justincase

O backup padrão, realizado desta forma, não é um processo incremental, contudo.
Para realizar a cópia incremental de arquivos, é necessário acrescentar a opção ‘–incremental’ ou sua abreviatura ‘-G’.
Veja um exemplo de uso:


time tar --incremental -cjf temp/backup-config.tar.bz .config/

real    1m44,454s
user    1m43,921s
sys 0m1,049s

Note que usei o comando time, no começo da linha.
Seu uso é opcional.
Como utilitário do sistema, o time, mede o tempo de execução da sequência de instruções que o seguem.
O mesmo procedimento, na segunda execução, já mostra uma redução de aproximadamente 10 segundos.


time tar --incremental -cjf temp/backup-config.tar.bz .config/

real    1m33,590s
user    1m33,276s
sys 0m0,991s

Experimente realizar o backup em diretórios com uma quantidade maior de arquivos grandes, para obter uma diferença de tempo bem maior.

Opções de compressão para o tar

É uma boa prática acrescentar a opção de compressão ao seu comando de backup com o tar:

  • você pode usar a opção ‘a’ para determinar automaticamente qual o programa/sistema de compressão será usado sobre o arquivo — baseado na sua extensão. Portanto se o arquivo tiver a extensão .tar.bz, o tar irá entender que deve usar o bzip para comprimí-lo.
  • você pode indicar manualmente o nome do programa de compressão com a opção ‘I’.
  • as opções de compressão mais comuns são ‘j’ (bzip2), ‘z’ (gzip), ‘Z’ (compress) e ‘J’ (xz). A primeira tem uma taxa de compressão melhor.
  • outras opções possíveis, são ‘–lzip’, ‘–lzop’ e ‘–lzma’.

Lembre-se que arquivos MP3, MPEG, JPEG – entre outros tipos de arquivos de mídia – já estão compactados e, nestes casos, não será possível obter uma taxa de compressão significativa.

Arquivos comprimidos são transferidos mais rápido pela rede ou para dentro da mídia de backup.
Por outro lado, o processo de compressão/descompressão pode sobrecarregar temporariamente o sistema.

Como recuperar arquivos tar

ibm flash backup drive
Para ver o conteúdo do arquivo, use a opção ‘t’:


tar tvf meubackup.tar.bz

Para recuperar o backup use a opção ‘x’ (extract). Neste caso, é importante informar ao tar sobre o método/programa usado para realizar a compressão:


tar xvjf meubackup.tar.bz

No exemplo acima, sei que preciso usar a opção ‘j’, por que a extensão do arquivo indica que ele foi comprimido com o bzip.
Ler a extensão de um arquivo, não é um meio muito confiável para determinar os padrões de compressão utilizados — por que a pessoa que realizou o backup é livre para escolher a extensão que ela quiser.
Você pode usar a opção ‘a’ ou nada, para permitir que o próprio tar descubra o método de compressão utilizado:


tar xvaf meubackup.tar.bz

ou


tar xvf meubackup.tar.bz

Como testar e obter informações de arquivos comprimidos com o tar

Você pode usar o comando file para tentar determinar o método de compressão utilizado em um arquivo:


file --brief ../backup-scripts.tar.bz 

bzip2 compressed data, block size = 900k

Ou, ainda,


file --uncompress --brief --mime backup-scripts.tar.bz 

application/x-tar; charset=binary compressed-encoding=application/x-bzip2; charset=binary

Pode também testar o arquivo com as opções já dadas:


tar -tvf meubackup.tbz

A extensão tbz, usada no exemplo acima, também é muito comum em arquivos tareados, comprimidos com o bzip2.
Testar os seus backups é tão importante quanto fazê-los.
Seria muito ruim descobrir que o backup não funcionou ou teve problemas, justo na hora em que você vai precisar dele.
hdd storage backup

A melhor hora para testar seus backups é quando você não precisa deles.
Assim, é possível analisar a situação com calma e determinar exatamente o que é que não está funcionando neste processo — e corrigir os problemas.

Como criar um script de backup

O script, que segue, reúne basicamente o que foi visto até aqui, neste artigo.
Entendo que você possa necessitar de algo mais complexo, para atender às suas necessidades particulares ou profissionais. Neste caso, ele pode servir como um ponto de partida para chegar aonde quer.
Não esqueça de alterar as variáveis de ambiente e os nomes de diretórios e arquivos, para refletir a sua realidade.

Script de backup


#!/bin/bash
# Descrição = Realiza cópia de segurança de arquivos importantes
# Criado em 20 de Abril de 2017
# Autor: Elias Praciano
# Version 1.0

## cria as variáveis para compor o nome arquivo de backup
# atribui à variável DATA os valores de
# data e hora atuais, para usar
# na composição do nome do arquivo
DATA=$(date +'%d-%m-%Y')

#  Define o nome do arquivo de backup
ARQUIVO=backup-$DATA.tar.gz

# cria a variável contendo o local de origem dos arquivos
ORGDIR=scripts

# cria a variável contendo o local de destino
DESDIR=backup

# comando de criação do backup
tar -cvvjf $DESDIR/$ARQUIVO $ORGDIR

Leia sobre como adicionar uma data ao nome do seu arquivo, se quiser ter mais flexibilidade nesta escolha, dentro do script
Antes de poder ser executado, o script precisa obter permissão de execução. Veja como fazer isto:


chmod +x ./nome-do-script-de-backup.sh

Agora, que ele já está pronto para rodar, teste-o:


./nome-do-script-de-backup.sh

Leia também por que usamos ./ na frente de alguns arquivos executáveis no Linux.

Referências

http://broexperts.com/how-to-perform-incremental-backup-in-linux-using-tar-utility/.

Como adicionar a data atual ao nome de um arquivo no Bash.

Esta dica pode ajudar em diversas situações, principalmente quando se quer criar um arquivo de dentro de um script Bash e se deseja incluir uma string com a data atual no próprio nome do arquivo.
Um dos casos em que se pode aplicar o recurso é um script de backup de segurança.
Veja alguns exemplos de como chegar ao resultado, no decorrer deste texto.
Se você tiver alguma solução diferente, sinta-se à vontade para compartilhá-la nos comentários.
Para obter a data atual, no formato dia-mês-ano, use a seguinte fórmula:


hoje=$(date +"%d-%m-%y")


O código Bash, acima, irá armazenar dentro da variável hoje a data no formato determinado anteriormente. Para poder ver conteúdo da variável, use o comando echo:


echo "a data atual é: $hoje."

Veja o meu resultado:

a data atual é: 23-04-17.

Para inserir o valor da data atual em uma variável com o nome de um arquivo, basta alterar estes exemplos.
Segue algumas dicas:


hoje=$(date +'%d-%m-%y')
nomearquivo=nomearquivo-$hoje

Para obter o valor da variável nomearquivo, use novamente o comando echo:


echo $nomearquivo
nomearquivo-23-04-17

Quando você for definir o nome do arquivo, dentro do script, basta lhe atribuir o valor da variável nomearquivo.
O post Como realizar backup incremental no Linux tem um exemplo real. Sugiro dar uma olhada.
Se preferir que o ano seja exibido com 4 dígitos, use o %Y (em maiúscula):


hoje=$(date +'%d-%m-%Y'); echo "Data atual: $hoje."

Exemplos de formatação do date no Bash Shell

Acompanhe mais alguns exemplos de formatação do comando.
Para incluir o nome do dia da semana:


hoje=$(date +'%A-%d-%m-%Y'); nomearquivo=backup-$hoje.bak; echo "Nome do meu arquivo de backup, hoje: $nomearquivo."
Nome do meu arquivo de backup, hoje: backup-domingo-23-04-2017.bak.

Ou, ainda, com o nome do mês completo:


hoje=$(date +'%A-%d-%B-%Y'); nomearquivo=backup-$hoje.bak; echo "Nome do meu arquivo de backup, hoje: $nomearquivo."
Nome do meu arquivo de backup, hoje: backup-domingo-23-abril-2017.bak.

E se eu precisar criar vários arquivos de backup, no mesmo dia?! Como posso adicionar a data (que vai ser a mesma), sem sobrescrever arquivos?
Há várias soluções para este caso.
A minha preferida é usar ‘%s’ no lugar de ou em adição ao nome do arquivo.
Este parâmetro retorna o número de segundos decorridos desde 1970-01-01 00:00:00 UTC.
Veja um exemplo:


minhadata=$(date +'%s')
nomearq=arq-$minhadata
echo -e "Nome do arquivo: $nomearq."

Para mim, o resultado da sequencia de comandos acima, foi:

Nome do arquivo: arq-1493045947.

Desta forma, basta que os arquivos sejam criados com uma diferença de, pelo menos, 1 segundo em relação ao outro.
Se esta não for uma necessidade, prefiro usar apenas o parâmetro ‘%F’:



minhadata=$(date +'%F');nomearq=arq-$minhadata;echo -e "\nNome do meu arquivo:\t$nomearq."
Nome do meu arquivo:	arq-2017-04-24.

Ou o ano (em 4 dígitos) seguido do número do dia, uma vez que a data já é exibida à direita dos nomes dos arquivos, na listagem dos diretórios — o que torna esta informação redundante.
Veja um exemplo:


minhadata=$(date +'%Y-%j');nomearq=arq-$minhadata;echo -e "\nNome do meu arquivo:\t$nomearq."
Nome do meu arquivo:	arq-2017-114.

Saiba mais usando o ‘man date’.

Como afinar seu violão com Linux

É possível reproduzir os tons de cada corda, para afinar o seu violão, com apenas uma linha de comando, no Linux.
Quem tem um computador, pode, se quiser, usar um programa específico para este fim. Mas usar estas linhas de comando tem a vantagem de não ocupar espaço algum — além do fato de que traz a oportunidade de aprender um pouco mais sobre Linux, shell scripting, Bash… em uma curta e divertida brincadeira.
Cordas de um violão

O que precisa estar instalado no Linux

Para conseguir ter sucesso na execução desta instrução é preciso ter o pacote do SoX instalado no seu sistema.
Quem usa Ubuntu, Linux Mint ou qualquer outra distro baseada no Debian, pode instalar o SoX com o comando apt-get:

sudo apt-get install sox

Quem usa Fedora ou outra distro baseada no Red Hat, pode usar o comando yum:

yum install sox

O SoX é o canivete suíço dos utilitários de processamento de som. Ele pode converter arquivos de áudio para outros tipos de arquivos populares e, ainda, lhes aplicar efeitos sonoros enquanto faz a conversão.

Como produzir as notas das cordas de um violão na linha de comando do Linux

A dica foi revelada pelo @climagic e consiste no uso de alguns utilitários e comandos Linux — nada que ocupe mais do que uma linha de comando. 😉
Abra um terminal e execute o seguinte código:

n=('' E4 B3 G3 D3 A2 E2);while read -n1 -p 'string? ' i;do case $i in [1-6]) play -n synth pl ${n[$i]} fade 0 1 ;; *) echo;break;;esac;done

Ao executar o código, o sistema irá pedir para que você forneça um número de 1 a 6, correspondente à corda do violão. Qualquer outro valor, terminará o processo.

comando para produzir sons com o SoX
Clique para ampliar.

Se você tem a intenção de usar mais vezes este código, insira-o em um script.
Abra o seu editor de textos favorito e digite:

#! /bin/bash
# Script para auxiliar a afinar violão
n=('' E4 B3 G3 D3 A2 E2);
while read -n1 -p 'string? ' i;
	do case $i in [1-6])
		play -n synth pl ${n[$i]} fade 0 1 ;; *) echo;
		break;;
	esac;
done

Não se esqueça de tornar o script executável. Caso ele se chame afinar.sh, faça assim:

chmod +x afinar.sh

Agora, ele já pode ser executado:

./afinar.sh
string?

Divirta-se!

Referências:
Página oficial do SoX: http://sourceforge.net/projects/sox/

Como executar queries MySQL de uma shell script.

É possível inserir queries MySQL dentro de scripts shell, da mesma forma que você faria com a linguagem PHP, Perl etc.
Em vez de invocar o MySQL diretamente da linha de comando do console Bash ou digitar suas queries dentro do cliente MySQL, é possível automatizar atividades rotineiras. relacionados a bancos de dados, com scripts.
pícture of a mountain and mysql logo
É comum realizar este trabalho com o uso da linguagem Perl (com a interface DBI), no Linux/UNIX. Mas, se o que você quer, precisa ser feito rapidamente e não for muito complicado, pode ser mais interessante usar shell scripts.
Ao usar o MySQL na linha de comando, é possível pós processar os resultados com outros comandos da shell, filtrar as saídas e obter resultados mais relevantes.

Exemplos de shell scripts com comandos SQL

O script que segue serve para exibir o tempo em que o seu servidor MySQL está no ar ou uptime.
O script vai executar uma query SHOW STATUS para obter o valor da variável do status que contém o uptime (em segundos).
Abra o seu editor de texto favorito e digite o código abaixo:

#! /bin/sh
# myuptime.sh - exibe o uptime total do servidor em segundos
mysql -u root -p -B -N -e "SHOW STATUS LIKE 'Uptime'"

É importante que se diga que o editor de texto, para escrever código de programas, não pode inserir formatação dentro do script. Use um editor de texto puro, como o nano, o vi, gedit, mousepad etc.


Agora, torne o arquivo script myuptime.sh executável:

chmod +x ./myuptime.sh

Feito isto, execute-o:

./myuptime.sh 

O script vai pedir a senha de root do servidor MySQL, antes de mostrar o resultado:

Enter password: 
Uptime	3180

Entenda o script linha a linha

  • #! /bin/sh — esta primeira linha é especial. Ela invoca o Bash, que irá interpretar e executar as instruções contidas neste script.
  • # myuptime.sh ... — linhas que começam com # são comentários e, portanto, não são executadas.
  • mysql -u root -p — se você já é iniciado no MySQL, sabe que esta parte da instrução inicia o cliente, faz login e pede a senha do usuário root.
  • -B — gera uma saída batch. Exibe os resultados, usando a caractere tab como separador de colunas.
  • -N — suprime o cabeçalho da coluna. Assim temos uma saída mais limpa.
  • -e "SHOW STATUS LIKE 'Uptime'" — este é o “miolo” do nosso script — onde a mágica acontece.

Experimente remover as opções -B -N, para ver o que acontece.
Altere a linha mysql -u root -p -B -N -e "SHOW STATUS LIKE 'Uptime'", no script, para mysql -u root -p -e STATUS | grep -i uptime.
Eu obtive o seguinte resultado, após esta alteração:

Uptime:			1 hour 18 min 42 sec

Leia mais

Conheça outras formas de executar queries MySQL da linha de comando e que podem ser usadas dentro de seus scripts.
Entenda melhor o comando grep, para filtrar os seus resultados e excluir informações irrelevantes.
Saiba como pegar queries do histórico do MySQL.