Laços - Linux
Os laços permitem executar um conjunto de comandos repetidamente, dependendo de uma condição. Bash oferece os seguintes tipos de laços:
: executa um determinado número de vezesfor
: executa enquanto a condição especificada for verdadeirawhile
: executa até que a condição especificada se torne verdadeirauntil
Laço while
O laço while
while condição
do
comandos_a_serem_executados
done
Após o while
do
done
#!/bin/bash
# Script que utiliza o laço while
num=0
while [ $num -lt 5 ]
do
echo "num é igual a $num"
num=$((num+1))
done
echo "Fim do programa"
exit 0
Aqui, a condição é a seguinte expressão: [ $num -lt 5 ]
num
echo "num é igual a $num"
num=$((num+1))
Isso significa que o valor da variável num
programicio@Programicio:~$ bash hello num é igual a 0 num é igual a 1 num é igual a 2 num é igual a 3 num é igual a 4 Fim do programa
Laço until
O laço until
#!/bin/bash
# Script que utiliza o laço until
num=0
until [ $num -eq 5 ]
do
echo "num é igual a $num"
num=$((num+1))
done
echo "Fim do programa"
exit 0
Aqui, os mesmos comandos do laço são usados, mas com uma condição diferente: $num -eq 5
num
O resultado do script será idêntico ao anterior:
programicio@Programicio:~$ bash hello num é igual a 0 num é igual a 1 num é igual a 2 num é igual a 3 num é igual a 4 Fim do programa
Laço for
O laço for
for (( contador; condição; incremento_do_contador)); do
conjunto_de_comandos
done
Após a palavra for
Após o cabeçalho do laço, entre as palavras do
done
Por exemplo, se precisamos executar uma ação 5 vezes, podemos definir o seguinte script:
#!/bin/bash
# Script que utiliza o laço for
for ((i=0; i < 5; i++))
do
echo "i é igual a $i"
done
echo "Fim do programa"
exit 0
Aqui, o contador é a variável i
A condição i < 5
i
Após cada execução dos comandos do laço, o valor da variável i
1
i++
O corpo do laço é composto por um comando que exibe o valor da variável i
echo "i é igual a $i"
Dessa forma, antes de executar o laço, a variável i
i < 5
i
i é igual a $i
i
i++
i
programicio@Programicio:~$ bash hello i é igual a 0 i é igual a 1 i é igual a 2 i é igual a 3 i é igual a 4 Fim do programa
Para definir condições, podemos usar os operadores de comparação padrão: <
>
<=
>=
==
!=
Para incrementar o contador do laço, podemos usar operadores de incremento (aumento de 1) ++
--
+=
-=
for ((i=0; i < 5; i=i+2))
do
echo "i é igual a $i"
done
Outro exemplo é executar o laço até que o contador se torne igual a 0:
#!/bin/bash
# Script que utiliza o laço for
for ((i=10; i != 0; i--))
do
echo "i é igual a $i"
done
echo "Fim do programa"
exit 0
Laço for..in
Uma forma especial do laço for
for..in
for variável in conjunto_de_valores
do
conjunto_de_comandos
done
O laço for passa por um conjunto de valores, colocando cada valor na variável. Entre os comandos do
done
Por exemplo, podemos iterar sobre um arquivo de texto linha por linha:
#!/bin/bash
for i in `cat /etc/passwd`
do
echo $i
done
exit 0
Neste exemplo, todas as linhas do arquivo /etc/passwd
cat /etc/passwd
i
echo $i
Outro exemplo seria pingar alguns endereços da rede local. Para isso, definimos o seguinte script:
#!/bin/bash
for i in $@
do
ping -c 1 192.168.1.$i
done
exit 0
Observe o uso de $@
programicio@Programicio:~$ bash hello 1 2 3 4 5 PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. --- 192.168.1.1 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data. --- 192.168.1.2 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 192.168.1.3 (192.168.1.3) 56(84) bytes of data. --- 192.168.1.3 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 192.168.1.4 (192.168.1.4) 56(84) bytes of data. --- 192.168.1.4 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 192.168.1.5 (192.168.1.5) 56(84) bytes of data. 64 bytes from 192.168.1.5: icmp_seq=1 ttl=62 time=67.8 ms --- 192.168.1.5 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 67.823/67.823/67.823/0.000 ms
Nesse caso, o script recebe o conjunto 1 2 3 4 5
$@
i