O versátil for
loop Bash faz muito mais do que repetir um determinado número de vezes. Descrevemos suas muitas variantes para que você possa usá-las com sucesso em seus próprios scripts Linux.
Índice
O loop for
Todas as linguagens de script e programação possuem alguma forma de lidar com loops. Um loop é uma seção de código que você deseja executar repetidamente. Em vez de digitar o mesmo conjunto de instruções em seu script , repetidamente, um loop repetirá uma seção de código indefinidamente para você.
O loop Bash for
é muito flexível. Ele pode funcionar com números, palavras, matrizes, variáveis de linha de comando ou a saída de outros comandos. Eles são usados no cabeçalho do loop. O cabeçalho determina com o que o loop está trabalhando – números ou strings, por exemplo – e qual é a condição final que interromperá o loop.
O corpo do loop contém o código que você deseja repetir. Ele contém o que você deseja que o loop faça. O corpo do loop pode conter qualquer comando de script válido.
Uma variável chamada contador de loop ou iterador é usada para percorrer um intervalo de valores ou uma lista de itens de dados. Para cada loop, o iterador assume o valor do próximo número, string ou qualquer tipo de dados sobre o qual o loop está iterando. Isso permite que o loop trabalhe com os valores de cada um dos itens de dados por vez ou até mesmo, em alguns casos, manipule os próprios itens de dados.
Simples para Loops
Se você deseja escrever seu primeiro loop for, estes exemplos simples irão ajudá-lo a começar.
para loops usando listas numéricas
Você pode executar um for
loop na linha de comando. Este comando cria e executa um for
loop simples. O iterador é uma variável chamada i
. Vamos atribuir i
cada um dos valores na lista de números, por sua vez. O corpo do loop imprimirá esse valor na janela do terminal. A condição que encerra esse loop é quando i
iterou em toda a lista de números.
para eu em 1 2 3 4 5; faça echo $i; feito
É importante notar aqui que a variável i
aumenta uma unidade cada vez que o loop gira, mas isso ocorre porque a lista de números aumenta uma unidade a cada vez.
Esta lista de números começa em 3 e sobe em passos de dois, depois salta arbitrariamente para 44.
para i em 3 5 7 9 11 44; faça echo $i; feito
Não faz diferença para o for
loop. Ele começa em uma extremidade da lista e usa cada valor por vez, até que todos os valores da lista tenham sido usados.
Nem os números precisam estar em ordem crescente. Eles podem estar em qualquer ordem.
para i em 3 43 44 11 9; faça echo $i; feito
para loops usando listas de palavras
Podemos facilmente fazer o mesmo com as palavras. Copie o texto do script em um editor e salve-o como “word-list.sh”.
#!/bin/bashfor word in Esta é uma sequência de palavras
fazer
eco $palavra
feito
Você precisará usar chmod
para tornar o script executável e qualquer outro script copiado deste artigo. Basta substituir o nome do script sempre que usar o chmod
comando.
chmod +x lista de palavras.sh
Vamos executar o script.
./lista de palavras.sh
Assim como fez com os números, o iterador – neste exemplo, a variável word
– percorre a lista de itens de dados até chegar ao final da lista. O corpo do loop acessa o valor da word
variável e assim cada palavra da lista é processada.
para Loops com Intervalos Numéricos
Se você quisesse que um for
loop fosse executado 100 vezes, seria muito cansativo digitar uma sequência de 100 números no cabeçalho do loop. Os intervalos numéricos permitem especificar apenas o primeiro e o último número.
Este script é “intervalo de números.sh”.
#!/bin/bashpara eu em {1..10}
fazer
echo "Rotação em loop:" $i
feito
O intervalo de numeração é definido entre chaves ” {}
” com dois pontos ” ..
” separando os números que iniciam e terminam o intervalo. Certifique-se de não incluir nenhum espaço em branco na definição do intervalo.
É assim que funciona:
./intervalo de números.sh
Você pode incluir outro número que defina o tamanho do passo que o iterador deve usar para percorrer os números no intervalo. Este script, “number-range2.sh” usará um intervalo de 0 a 32 e um tamanho de passo de 4.
#!/bin/bashpara eu em {0..32..4}
fazer
echo "Rotação em loop:" $i
feito
O iterador percorre o intervalo de números em saltos de quatro.
./intervalo de números2.sh
para loops usando nomes de arquivos
Como podemos processar listas de palavras, podemos fazer com que nossos scripts funcionem com nomes de arquivos. Este script é denominado “filenames.sh”.
#!/bin/bashpara arquivo em lista de palavras.sh intervalo de números.sh intervalo de números2.sh nomes de arquivos.sh
fazer
ls -lh "$arquivo"
feito
Seria inútil ter um script que fizesse apenas o que ls
pode, mas demonstra como acessar nomes de arquivos dentro do corpo do loop.
./nomes de arquivos.sh
De maneira semelhante ao uso do intervalo numérico, podemos usar um padrão de arquivo no cabeçalho do loop para especificar os arquivos que queremos processar. Isso evita muita digitação e significa que não precisamos saber antecipadamente os nomes dos arquivos.
Este script é denominado “filenames2.sh”. Substituímos a lista de nomes de arquivos pelo padrão de nome de arquivo “*.sh” para que o script reporte todos os arquivos de script no diretório atual.
#!/bin/bashpara arquivo em *.sh
fazer
ls -lh "$arquivo"
feito
Aqui está a saída.
./nomes de arquivos2.sh
para loops usando parâmetros de linha de comando
Podemos adicionar mais flexibilidade passando o padrão de nome de arquivo na linha de comando. A $*
variável representa todos os parâmetros da linha de comando passados para o script.
Este é “nomes de arquivos3.sh”.
#!/bin/bashpara arquivo em $*
fazer
ls -lh "$arquivo"
feito
Solicitaremos nomes de arquivos que comecem com “n” e tenham uma extensão SH.
./nomesdearquivos3.sh n*.sh
Também podemos passar mais de um padrão por vez.
./nomes de arquivos3.sh n*.sh .bashrc
A variável iteradora file
assume o valor de cada um dos parâmetros da linha de comando. Os padrões de nome de arquivo são expandidos e todos os nomes de arquivo são processados no corpo do loop.
Tipo C para Loops
Bash oferece suporte ao loop for clássico de três termos, como aqueles encontrados na linguagem de programação C. Eles são chamados de loops for de três termos porque há três termos no cabeçalho do loop.
- O valor inicial do iterador de loop.
- O teste para saber se o loop continua ou termina.
- O incremento — ou decremento — do iterador.
Este script é “c-like.sh.”
O iterador I
é definido como 1 no início do loop, e o loop será executado enquanto a instrução ” i<=10
” for verdadeira. Assim que i
chegar a 11, o for
loop irá parar. O iterador está sendo aumentado em um a cada revolução do loop.
#!/bin/bashpara (( i=1; i<=10; i++ ))
fazer
echo "Número do loop:" $i
feito
Vamos executar este script.
./c-like.sh
O loop tipo C for
permite a fácil criação de for
loops que possuem requisitos ligeiramente estranhos. Este loop começa em 15 e conta regressivamente em etapas de 3. Este é “c-like2.sh”
#!/bin/bashpara (( i=15; i>0; i-=3 ))
fazer
echo "Número do loop:" $i
feito
Quando o executamos, ele deve retroceder em passos de três.
./c-like2.sh
Infinito para Loops
Você também pode usar este formato de for
loop para criar um loop infinito. Tudo que você precisa fazer é remover todos os elementos do cabeçalho do loop, assim. Este é “infinito.sh”.
#!/bin/bashpara (( ; ; ))
fazer
echo "Pressione Ctrl+C para parar..."
dormir 1
feito
Você precisará pressionar Ctrl+C para interromper o loop.
./infinito.sh
para loops usando matrizes de palavras
Podemos iterar facilmente por meio de uma série de palavras. Precisamos fornecer o nome do array no cabeçalho do loop e o iterador percorrerá todas as entradas do array. Este é “word-array.sh”.
#!/bin/bashdistribuições=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
para distribuição em $distributions
fazer
eco $ distribuição
feito
Todas as distribuições estão listadas para nós.
./word-array.sh
O comando continuar
Se você quiser que o loop passe por uma entrada específica, teste se o iterador corresponde a essa entrada e use o continue
comando. O continue
comando abandona o giro atual do loop. Ele incrementa o iterador e inicia a próxima rotação do loop – assumindo que a entrada que você deseja pular não é o último item da lista.
Este é “word-array2.sh”. Ele passa pela entrada do array “Arch”, mas processa todos os outros membros do array.
#!/bin/bashdistribuições=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
para distribuição em $distributions
fazer
if [[ "$distro" == "Arco" ]] ;
então
continuar
fi
eco $ distribuição
feito
“Arch” não aparece na janela do terminal.
./word-array2.sh
O comando de pausa
O break
comando sai do loop e impede qualquer processamento adicional.
Este é “word-array3.sh”. É igual ao script anterior, continue
substituído por break
.
#!/bin/bashdistribuições=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
para distribuição em $distributions
fazer
if [[ "$distro" == "Arco" ]] ;
então
quebrar
fi
eco $ distribuição
feito
Quando o iterador contém “Arch”, o loop for abandona qualquer processamento.
./word-array3.sh
para loops usando matrizes associativas
No Bash 4 e superior, matrizes associativas permitem criar listas de pares chave-valor que podem ser pesquisados pela chave ou pelo valor. Devido ao relacionamento bidirecional entre a chave e o valor, eles também são chamados de dicionários de dados.
Podemos iterar por meio de um array associativo usando um for
loop. Este script é “associativo.sh”. Ele define uma matriz associativa com quatro entradas, uma para cada “cachorro”, “gato”, “robin” e “humano”. Estas são as chaves. Os valores são o número (padrão) de pernas que cada um possui.
#!/bin/bashdeclarar -A animais=([cachorro]=Quatro patas [gato]=Quatro patas [robin]=Duas patas [humano]=Duas patas)
para pernas em ${!animals[@]}
fazer
if [ ${animais[$pernas]} == "Duas pernas" ]; então
eco ${pernas}
fi
feito
O iterador é chamado legs
. Observe que o cabeçalho do loop contém um !
ponto de exclamação ” “. Isso não atua como o operador lógico NOT, faz parte da sintaxe do array associativo. É necessário pesquisar no array.
O corpo do loop executa um teste de comparação de strings. Se o valor do membro da matriz for “Duas pernas”, ele imprimirá o valor da chave na janela do terminal. Quando o executamos, o script imprime as criaturas de duas pernas.
./associativo.sh
Iterando sobre a saída de comandos
Se você tiver um comando ou sequência de comandos que produza uma lista de algo, como nomes de arquivos, poderá iterá-los com um for
loop. Você precisa estar atento a expansões inesperadas de nomes de arquivos, mas em casos simples tudo bem.
Este script é “command.sh”. ele usa ls
e wc
para fornecer uma lista ordenada de nomes de arquivos de script, juntamente com suas contagens de linhas, palavras e bytes.
#!/bin/bashpara i em $(ls *.sh | sort);
fazer
eco $(wc $i)
feito
Quando o executamos obtemos as estatísticas de cada arquivo, com os arquivos listados em ordem alfabética.
./command.sh
O deslumbrante for Loop
O for
loop é uma ferramenta de script versátil e de fácil compreensão. Mas por mais flexível que seja, não se esqueça de que existem outros loops por uma razão. Não se surpreenda pensando que o for
loop é tudo que você precisa.
O while
loop, por exemplo, é muito mais adequado para certas coisas do que o for
loop, como ler linhas de um arquivo .
Escrever bons roteiros significa usar a ferramenta mais adequada para a tarefa em questão. O for
loop é uma ótima ferramenta para ter em sua caixa de ferramentas de truques.