Sitemap

Bash Loops: for, while, until e select

7 min readOct 8, 2026

--

Press enter or click to view image in full size

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 for

Sintaxe 2:

for NOME [in lista]
do
COMANDOS
done

#do fora da linha do for

Sintaxe 3:

for NOME [in LISTA]; do COMANDOS; done

#tudo junto

Sintaxe 4:

for (( variavel ;condição_para_finalizar_loop ; mudanças_na_variavel )); do
COMANDOS
done

#sem in lista

Exemplos:

Exibindo valores entre chaves:

for n in {1..5}; do echo $n; done
for i in {0..10..2}
do
echo "$i"
done
for i in {5..0}
do
echo "$i"
done
Press enter or click to view image in full size

Combando 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 ; done
Press enter or click to view image in full size

Exibindo 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[*]}" ; done
Press enter or click to view image in full size

Exibir 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]}";done
perifericos=("mouse" "teclado" "fone")
for periferico in "${#perifericos[@]}"; do echo $periferico; done
for periferico in "${!perifericos[@]}"; do echo $periferico; done
Press enter or click to view image in full size

Sem in:(for_sem_in.sh)

#!/bin/bash
for qualquercoisa; do echo $qualquercoisa; done

#chamando:
./for_sem_in.sh seila algumacoisa qualquercoisa

Com variável; condição; mudança:

for ((i=0; i<5; i++))
do
echo "$i"
done

Contagem crescente:

for ((i=1; i<=10; i++)) ; do  echo “$i” ; done
Press enter or click to view image in full size

Contagem regressiva:

for ((n=10; n>=1; n--)) ; do  echo “$n” ; done

Com break e if 1:

for i in {1..10} ;do  echo “$i”
if (( i == 5 ))
then
break
fi
done

Com continue:

for i in {1..5} ; do
if (( i == 3 ))
then
continue
fi
echo "$i" ; done
Press enter or click to view image in full size

Com for duas vezes:

for i in {1..3} ; do
for j in {1..3} ; do
echo “$i $j”
done
done

Listando todos arquivos que terminam com .sh:

for arquivo in *.sh
do
echo "$arquivo"
done
Press enter or click to view image in full size

Ler 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"
done
Press enter or click to view image in full size

While 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 done

Sintaxe 2:

while condição; do 
comandos
done

Exemplos, 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 5
n=0
while true; do
echo $n
done
#loop eterno de printar o valor de n, 0
contador=1
while (( contador <= 5 ))
do
echo "$contador"
((contador++))
done
#usando operador <
Press enter or click to view image in full size

Outro loop infinito:

while true
do
echo “infinito”
done
Press enter or click to view image in full size

Mais loop infinito:

while true
do
date
sleep 5
done
#posta o comando date de 5 em 5 minutos
Press enter or click to view image in full size

While para ler arquivo:

while read -r linha
do
echo "$linha"
done < arquivo.txt
# read com -r torna / literal e não escape.
Press enter or click to view image in full size

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á lido
Press enter or click to view image in full size

Loop infinito e interativo com while:

while true
do
read -rp "Digite algo: " texto
if [[ "$texto" == "sair" ]]
then
break
fi
echo "Você digitou: $texto"
done
Press enter or click to view image in full size

While 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
done
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size

UNTIL

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++))
done

Loop infinito:

n='infinito'
until false; do
echo $n
done
Press enter or click to view image in full size

SELECT

Loop de menus interativos, que fica ativo até uma opção ser escolhida. Comumente usa while junto.

Sintaxe:

select variaveis in lista
do
comandos
done

Com 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
done
Press enter or click to view image in full size
PS3="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
done
Press enter or click to view image in full size

O 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
done
Press enter or click to view image in full size

Acabou.

--

--