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