Uma estrutura de repetição, também conhecida como loop ou laço, é uma estrutura de desvio do fluxo de controle presente em linguagens de programação que realiza e/ou repete diferentes algoritmos/ações dependendo se uma condição é verdadeira ou falsa. Vejamos os comandos while, until e for.
While
Os comandos são executados enquanto a condição for verdadeira. No exemplo a seguir, enquanto o contador for diferente (“ne” significa “not equal”) de 4, será imprimida na tela uma mensagem, será aguardado 1 segundo e atualizado o contador:
#!/bin/bash contador=1 while [ $contador -ne 4 ]; do echo "Messagem exibida $contador vez". sleep 1; ((contador=$contador+1)) done
For
O laço for executa uma ação até que uma condição seja atendida. No exemplo abaixo, cada linha do arquivo subs.csv é lida (através do comando “cat” e impressa usando “echo”) até o final do arquivo e as letras maiúsculas são substituídas por minúsculas, mandando a saída para o arquivo subestacoes.csv:
#! /bin/bash for i in $(cat subs.csv); do echo $i | tr 'A-Z' 'a-z'; done > subestacoes.csv
Veja esse outro exemplo, onde o for serve para varrer todos os arquivos com extensão “.csv” e pega partes do nome do arquivo para criar pastas e mover os arquivos para esses novos diretórios:
#!/bin/bash
# Exemplo de formato do nome do arquivo:
# 201207061556.csv
for i in *.csv; do
ano=`echo ${i:0:4}`
mes=`echo ${i:4:2}`
dia=`echo ${i:6:2}`
caminho=$ano/$mes/$dia
echo $caminho
mkdir -p $caminho
mv $i $caminho
done
Funções
Uma forma de repetir comandos é através do uso de funções. A função é um bloco de código que pode ser invocado pelo resto do script apenas escrevendo o nome da função. Ela deve ser escrita antes da rotina principal (ou escreva a rotina principal dentro de outra função e chame-a depois). A função não recebe parâmetros de entrada, assim a função deve ser chamada e em seguida incluir a variável (ou variáveis) a ser utilizada na função, enquanto que na função deve-se usar “$1” para receber essa variável (ou $2, $3.. para mais variáveis). Veja esse exemplo:
#!/bin/bash
# Declaração de uma função em ShellScript
function BoasVindas(){
echo -e "\n\nSeja Bem Vindo $1 \n\n"
}
echo -n "Digite seu nome: "
read _NOME
# A variável _NOME receberá o que foi digitado pelo usuário
BoasVindas "$_NOME"
# Aqui passamos o conteúdo da variável _NOME como o 1º parâmetro para a função BoasVindas()
Um exemplo integrando tudo. O separador de campo é alterado para quebra de linha (e restaurado no final do script). Para todas as linhas do arquivo, são extraídos em diferentes variáveis os campos ano, mês, dia… cidade, incluído o zero na frente do número (caso tenha apenas 1 dígito, através do while), e impressos no arquivo de saída conforme a variável “novalinha”:
#!/bin/bash
function coloca_zero(){
a=$1
b=`echo "$a" | wc -L | awk '{print $1}'`
while [ $b != 2 ]; do
b=$((b+1))
a=0$a
done
echo $a
}
oldIFS=$IFS # backup do separador de campo
IFS=$'\n' # novo separador de campo, o caractere de fim de linha
i=1
for linha in $(cat subestacoes.csv); do
ano=`echo $linha |cut -d',' -f1`
mes=`echo $linha |cut -d',' -f3`
dia=`echo $linha |cut -d',' -f5`
hora=`echo $linha |cut -d',' -f7`
min=`echo $linha |cut -d',' -f9`
seg=`echo $linha |cut -d',' -f11`
mili=`echo $linha |cut -d',' -f12`
lat=`echo $linha |cut -d',' -f13`
lon=`echo $linha |cut -d',' -f14`
cidade=`echo $linha |cut -d',' -f15`
#a=4 ; b=`echo "$a" | wc -L | awk '{print $1}'` ; while [ $b != 2 ]; do b=$((b+1)) ; a=0$a ;done ; echo "$a"| sed 's/ //g'
#colocar zero na frente
a=$mes
coloca_zero "$a"
mes=$a
a=$dia
coloca_zero "$a"
dia=$a
a=$hora
coloca_zero "$a"
hora=$a
a=$min
coloca_zero "$a"
min=$a
a=$seg
coloca_zero "$a"
seg=$a
# imprimir linha arrumada em arquivo
novalinha=`echo $ano-$mes-$dia $hora:$min:$seg,$mili,$lat,$lon,$cidade`
echo $novalinha
done > subestacoes2.csv
IFS=$old_IFS # restabelecimento do separador de campo padrão
Leia mais em: Introdução ao Shell Script no Linux e Viva o Linux.




2 comments