Bash Loops: for, while, until e select
for
Mais usado para quando já se sabe o limite da lista para repetir o loop que iterará sob cada item de uma lista(arquivos, arrays, argumentos, números, etc).
Sintaxe 1(in LISTA é opcional):
for NOME [in lista]; do
COMANDOS
done
#do na linha do forSintaxe 2:
for NOME [in lista]
do
COMANDOS
done
#do fora da linha do forSintaxe 3:
for NOME [in LISTA]; do COMANDOS; done
#tudo juntoSintaxe 4:
for (( variavel ;condição_para_finalizar_loop ; mudanças_na_variavel )); do
COMANDOS
done
#sem in listaExemplos:
Exibindo valores entre chaves:
for n in {1..5}; do echo $n; donefor i in {0..10..2}
do
echo "$i"
donefor i in {5..0}
do
echo "$i"
doneCombando chaves com chaves:
for i in {1..3}{4..6} ; do echo $i ; done
for i in {a..d}{e..g} ; do echo $i ; done
for i in {a..c}{1..3} ; do echo $i ; doneExibindo elementos de arrays:
dispositivos=("mouse" "teclado" "fone" "monitor")
for dispositivo in dispositivos; do echo "${dispositivos[0]}" ; done
for dispositivo in dispositivos; do echo "${dispositivos[@]}" ; done
for dispositivo in dispositivos; do echo "${dispositivos[*]}" ; doneExibir quantidade de elementos:
for distro in debian arch rocky ; do echo "$distro" ;done
for distro in arch debian rocky ; do echo "distro: $distro" ; done
distros=("debian" "arch" "rocky")
for n in "${!distros[@]}"; do echo "distro $n: ${distros[$n]}";doneperifericos=("mouse" "teclado" "fone")
for periferico in "${#perifericos[@]}"; do echo $periferico; done
for periferico in "${!perifericos[@]}"; do echo $periferico; doneSem in:(for_sem_in.sh)
#!/bin/bash
for qualquercoisa; do echo $qualquercoisa; done
#chamando:
./for_sem_in.sh seila algumacoisa qualquercoisaCom variável; condição; mudança:
for ((i=0; i<5; i++))
do
echo "$i"
doneContagem crescente:
for ((i=1; i<=10; i++)) ; do echo “$i” ; doneContagem regressiva:
for ((n=10; n>=1; n--)) ; do echo “$n” ; doneCom break e if 1:
for i in {1..10} ;do echo “$i”
if (( i == 5 ))
then
break
fi
doneCom continue:
for i in {1..5} ; do
if (( i == 3 ))
then
continue
fi
echo "$i" ; doneCom for duas vezes:
for i in {1..3} ; do
for j in {1..3} ; do
echo “$i $j”
done
doneListando todos arquivos que terminam com .sh:
for arquivo in *.sh
do
echo "$arquivo"
doneLer arquivo.csv:
#!/bin/bash
#digitar o nome do arquivo
read -rp "Digite o nome do arquivo .CSV: " arquivo
IFS=','
#listando o conteúdo do arquivo citado
for campo in $(cat "$arquivo")
do
echo "$campo"
doneWhile x Until
While: começa o loop com condição verdadeira e o loop se encerra quando a condição se torna falsa. Muito usado para fazer monitoramento de condições, quando não se sabe o tamanho do argumento que será usado.
Get Linuxmon’s stories in your inbox
Join Medium for free to get updates from this writer.
Until: o oposto, começa o loop com condição falsa e o encerra quando a condição se torna verdadeira. Basicamente, Until é equivalente ao While not do python. Until possui a mesma sintaxe do while, só muda a palava chave.
Sintaxe 1:
while condição; do comandos doneSintaxe 2:
while condição; do
comandos
doneExemplos, usando comando test e loop infinito:
n=0
while [[ $n -lt 5 ]]; do
echo $n
((n++))
done
#n é 0, enquanto for menor que 5, some 1 ao valor de n. Loop encerra quando
#n deixa de ser menor que 5n=0
while true; do
echo $n
done
#loop eterno de printar o valor de n, 0contador=1
while (( contador <= 5 ))
do
echo "$contador"
((contador++))
done
#usando operador <Outro loop infinito:
while true
do
echo “infinito”
doneMais loop infinito:
while true
do
date
sleep 5
done
#posta o comando date de 5 em 5 minutosWhile para ler arquivo:
while read -r linha
do
echo "$linha"
done < arquivo.txt
# read com -r torna / literal e não escape.While ler .csv, modificando IFS:
#!/bin/bash
#primeiro argumento será nome, segundo será email e terceiro será país
while IFS=',' read -r nome email pais
do
echo "Nome: $nome"
echo "Email: $email"
echo "País: $pais"
echo "----------------"
done < arquivo.csv #arquivo.csv será lidoLoop infinito e interativo com while:
while true
do
read -rp "Digite algo: " texto
if [[ "$texto" == "sair" ]]
then
break
fi
echo "Você digitou: $texto"
doneWhile para criar menus(como o select será usado mais abaixo)
#!/bin/bash
pokemons=(charmander squirtle bulbasaur)
while true; do
clear
paste <(pokego -n charmander) <(pokego -n squirtle) <(pokego -n bulbasaur)
echo
echo "1 - charmander"
echo "2 - squirtle"
echo "3 - bulbasaur"
echo "4 - SAIR"
read -p "Escolha o Pokémon pelo número: " pkm
if [[ $pkm -eq 4 ]]; then
echo "saindo..."
break
elif [[ $pkm -ge 1 && $pkm -le 3 ]]; then
pokemon="${pokemons[$((pkm - 1))]}"
echo "Você escolheu $pokemon!"
if [[ $pkm -ne 3 ]]; then
echo "você escolheu um pokemon ruim!"
else
echo "você escolheu o melhor pokemon!"
fi
echo
pokego -n "$pokemon"
else
echo "Opção inválida!"
fi
read -p "Digite alguma coisa para continuar: " continua
doneUNTIL
n=0
until [[ $n -eq 5 ]]; do
echo $n
((n++))
done#com break
n=0
until false; do
[[ $n -lt 5 ]] && echo $n || break
((n++))
doneLoop infinito:
n='infinito'
until false; do
echo $n
doneSELECT
Loop de menus interativos, que fica ativo até uma opção ser escolhida. Comumente usa while junto.
Sintaxe:
select variaveis in lista
do
comandos
doneCom PS3 para alterar prompt de select e *)pega opções inválidas:
#!/usr/bin/env bash
PS3="Escolha um sistema bom: "
select opcao in Linux Windows Mac Sair
do
case "$opcao" in
Linux)
echo "Linux selecionado, fez a escolha certa!"
;;
Windows)
echo "Windows selecionado, errou! :("
;;
Mac)
echo "Mac selecionado, errou! :("
;;
Sair)
echo "flw..." ; break
;;
*)
echo "Opção inválida"
;;
esac
donePS3="Escolha uma linguagem que deseja aprender: "
select opcao in Bash Python C Sair
do
case "$opcao" in
Bash)
echo "Bash selecionado, documentação: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html"
;;
Python)
echo "Python selecionado, documentação: https://docs.python.org/pt-br/3/"
;;
C)
echo "C selecionado, documentação: https://www.ibm.com/docs/pt/i/7.4.0?topic=languages-c-c"
;;
Sair)
echo "flw..." ; break
;;
*)
echo "Opção inválida"
;;
esac
doneO mesmo menu de pokemons mas com select
#!/bin/bash
pokemons=(charmander squirtle bulbasaur)
while true; do
clear
paste \
<(pokego -n charmander) \
<(pokego -n squirtle) \
<(pokego -n bulbasaur)
echo
select pokemon in "${pokemons[@]}" "SAIR"; do
if [[ $REPLY -eq 4 ]]; then
echo "saindo..."
break 2
elif [[ $REPLY -ge 1 && $REPLY -le 3 ]]; then
echo "Você escolheu $pokemon!"
if [[ $REPLY -ne 3 ]]; then
echo "Você escolheu um pokemon ruim!"
else
echo "Você escolheu o melhor pokemon!"
fi
echo
pokego -n "$pokemon"
read -p "Digite alguma coisa para continuar: " continua
break
else
echo "Opção inválida!"
read -p "Pressione ENTER para continuar..."
break
fi
done
doneAcabou.








