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:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/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”:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#!/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
|
Fonte: https://www.monolitonimbus.com.br/shell-script-repeticao-e-funcao/