Shell Script: repetição e função

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.

Compartilhe :)

2 comments

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.