9 Exemplos de For Loops em Scripts Bash do Linux

0
44


fatmawati achmad zaenuri / Shutterstock.com

A festa versátil for loop faz muito mais do que fazer um loop em torno de um determinado número de vezes. Descrevemos suas muitas variantes para que você possa usá-las com sucesso em seus próprios scripts Linux.

O laço 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 escrever o mesmo conjunto de instruções em seu script repetidamente, um loop repetirá uma seção de código repetidamente para você.

a festa for loop é muito flexível. Ele pode trabalhar com números, palavras, arrays, variáveis ​​de linha de comando ou a saída de outros comandos. Estes 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.

a Corpo do loop contém o código que você deseja que seja repetido. Contém o que você quer que o loop Faz. O corpo do loop pode conter qualquer comando de script válido.

Uma variável chamada contador de loops ou iterador é usado 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 itera. Isso permite que o loop trabalhe nos valores de cada um dos itens de dados por sua vez, ou mesmo, em alguns casos, manipule os próprios itens de dados.

simples para loops

Se você deseja escrever seu primeiro loop for, esses exemplos simples ajudarão você 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 simples for círculo. O iterador é uma variável chamada i. vamos atribuir i ser 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 termina este loop é quando i iterou em toda a lista de números.

for i in 1 2 3 4 5; do echo $i; done

um loop for contando de 1 a 5

É importante notar aqui que a variável i aumenta em um a cada vez que o loop gira, mas isso ocorre porque a lista de números aumenta em um a cada vez.

Essa lista de números começa em 3 e sobe em etapas de dois, depois salta arbitrariamente para 44.

for i in 3 5 7 9 11 44; do echo $i; done

um loop for contando através de uma lista não sequencial de números

Não faz diferença para o for círculo. Comece em uma extremidade da lista e use cada valor por sua vez, até que todos os valores da lista tenham sido usados.

Também não é necessário que os números estejam em ordem crescente. Eles podem estar em qualquer ordem.

for i in 3 43 44 11 9; do echo $i; done

um loop for contando através de uma lista não ordenada de números

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/bash

for word in This is a sequence of words
do 
  echo $word
done

você terá que usar chmod para tornar o script executável e quaisquer outros scripts copiados deste artigo. Basta substituir o nome do script toda vez que você usar o chmod domínio.

chmod +x word-list.sh

Fazendo um script executável com chmod

Vamos executar o script.

./word-list.sh

Um loop for trabalhando através de uma lista de palavras

Assim como você 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 no word variável e assim cada palavra na lista é processada.

para loops com intervalos de números

se você queria um for loop fosse executado 100 vezes, seria bastante tedioso ter que escrever uma sequência de 100 números no cabeçalho do loop. Os intervalos de números permitem especificar apenas o primeiro e o último números.

Este script é “number-range.sh”.

#!/bin/bash

for i in {1..10}
do
  echo "Loop spin:" $i
done

O intervalo de números é definido entre colchetes “{}“Com dois períodos”..“Separe os números que iniciam e terminam o intervalo. Certifique-se de não incluir espaços em branco na definição do intervalo.

É assim que funciona:

./number-range.sh

Um loop for usando um intervalo de números

Você pode incluir outro número que defina o tamanho da etapa 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 etapa de 4.

#!/bin/bash

for i in {0..32..4}
do
  echo "Loop spin:" $i
done

O iterador percorre o intervalo de números em etapas de quatro.

./number-range2.sh

Um loop for usando uma etapa do iterador de 4

para loops usando nomes de arquivos

Como podemos processar listas de palavras, podemos fazer nossos scripts funcionarem com nomes de arquivos. Este script é chamado de “filenames.sh”.

#!/bin/bash

for file in word-list.sh number-range.sh number-range2.sh filenames.sh
do
  ls -lh "$file"
done

Seria bastante inútil ter um script que apenas faz o que ls pode fazer, mas demonstra como acessar nomes de arquivos dentro do corpo do loop.

./filenames.sh

Um loop for usando uma lista de nomes de arquivos

Semelhante ao uso do intervalo de números, podemos usar um padrão de arquivo no cabeçalho do loop para especificar os arquivos que queremos processar. Isso economiza muita digitação e significa que não precisamos saber os nomes dos arquivos com antecedência.

Este script é chamado de “filenames2.sh”. Substituímos a lista de nomes de arquivo pelo padrão de nome de arquivo “*.sh” para que o script relate todos os arquivos de script no diretório atual.

#!/bin/bash

for file in *.sh
do
  ls -lh "$file"
done

Aqui está a saída.

./filenames2.sh

Um loop for usando um padrão de arquivo de *.sh

para loops usando parâmetros de linha de comando

Podemos adicionar um pouco mais de flexibilidade passando o padrão de nome de arquivo na linha de comando. a $* A variável representa todos os parâmetros de linha de comando passados ​​para o script.

Este é “filenames3.sh”.

#!/bin/bash

for file in $*
do
  ls -lh "$file"
done

Solicitaremos nomes de arquivos que comecem com “n” e tenham extensão SH.

./filenames3.sh n*.sh

Um loop for que recebe um padrão de arquivo como parâmetro de linha de comando

Também podemos passar em mais de um padrão por vez.

./filenames3.sh n*.sh .bashrc

Um loop for que recebe um padrão de arquivo e os parâmetros de linha de comando de um nome de arquivo

A variável iteradora file assume o valor de cada um dos parâmetros de 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.

RELACIONADO: Como trabalhar com variáveis ​​no Bash

Tipo C para loops

O Bash suporta o 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 existem 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 o ” i<=10 “É verdade. Assim que i chega a 11, o for o laço vai parar. O iterador é incrementado em um, a cada revolução do loop.

#!/bin/bash

for (( i=1; i<=10; i++ ))
do 
  echo "Loop number:" $i
done

Vamos executar este script.

./c-like.sh

Um loop for de três termos ou semelhante a C

tipo c for loop permite a criação fácil de for loops que têm requisitos um pouco estranhos. Este loop começa em 15 e conta em etapas de 3. Isso é “c-like2.sh”

#!/bin/bash

for (( i=15; i>0; i-=3 ))
do 
  echo "Loop number:" $i
done

Quando o executamos, ele deve voltar em passos de três.

./c-like2.sh

Um loop do tipo C para contagem regressiva

infinito para loops

Você também pode usar este formato for loop para criar um loop infinito. Tudo o que você precisa fazer é remover todos os elementos do cabeçalho do loop, assim. Este é “infinity.sh”.

#!/bin/bash

for (( ; ; ))
do
  echo "Press Ctrl+C to stop..."
  sleep 1
done

Você precisará pressionar Ctrl + C para parar o loop.

./infinite.sh

Um loop for infinito do tipo C

para loops usando arrays de palavras

Podemos facilmente iterar através de uma matriz de palavras. Precisamos fornecer o nome do array no cabeçalho do loop, e o iterador irá percorrer todas as entradas do array. Este é “word-array.sh”.

#!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

for distro in $distributions
do
  echo $distro
done

Todas as distribuições estão listadas para nós.

./word-array.sh

Um loop for usando uma matriz de palavras

O comando continuar

Se você quiser que o loop faça um loop em uma entrada específica, teste se o iterador corresponde a essa entrada e use o continue domínio. a continue O comando deixa o Atual torção do laço. Incrementa o iterador e inicia a próxima rodada do loop, assumindo que a entrada que você deseja pular não é o último item da lista.

Este é “word-array2.sh”. Faz um loop sobre a entrada do array “Arc”, mas processa todos os outros membros do array.

#!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

for distro in $distributions
do
  if [[ "$distro" == "Arch" ]] ;
    then
    continue
  fi
  echo $distro
done

“Arc” não aparece na janela do terminal.

./word-array2.sh

Um loop for pula uma entrada em uma matriz de palavras devido ao comando continue

O comando de quebra

a break O comando sai do loop e impede o processamento adicional.

Este é “word-array3.sh”. É o mesmo que o script acima com continue substituído por break.

#!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

for distro in $distributions
do
  if [[ "$distro" == "Arch" ]] ;
    then
    break
  fi
  echo $distro
done

Quando o iterador contém “Arch”, o loop for abandona qualquer processamento adicional.

./word-array3.sh

Um loop for que abandona o pós-processamento devido ao comando break

para loops usando arrays associativos

No Bash 4 e posterior, os arrays associativos permitem que você crie listas de pares chave-valor que podem ser pesquisados ​​por chave ou valor. Devido à relação bidirecional entre chave e valor, eles também são chamados de dicionários de dados.

Podemos iterar através de um array associativo usando um for círculo. Este script é “associative.sh”. Define um array associativo com quatro entradas, cada uma de “dog”, “cat”, “robin” e “human”. Estas são as chaves. Os valores são o número (padrão) de pernas que cada um possui.

#!/bin/bash

declare -A animals=( [dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged )

for legs in ${!animals[@]}
do
  if [ ${animals[$legs]} == "Two-legged" ]; then 
    echo ${legs}
  fi
done

O iterador é chamado legs . Observe que o cabeçalho do loop contém um “!“Ponto de exclamação. Isso não funciona como o operador lógico NOT, é 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”, imprima o valor da chave na janela do terminal. Quando o executamos, o script imprime as criaturas de duas pernas.

./associative.sh

Usando um loop for para extrair elementos de um array associativo

Iterando sobre a saída de comandos

Se você tem um comando ou script que produz uma lista de algo, como nomes de arquivos, você pode iterar sobre eles com um for círculo. Você precisa ter cuidado com expansões inesperadas de nomes de arquivos, mas em casos simples, tudo bem.

Este script é “command.sh”. usa ls S wc para fornecer uma lista ordenada de nomes de arquivos de script, juntamente com suas contagens de linhas, palavras e bytes.

#!/bin/bash

for i in $(ls *.sh | sort);
do 
  echo $(wc $i)
done

Quando o executamos, obtemos estatísticas para cada arquivo, com os arquivos listados em ordem alfabética.

./command.sh

Usando um loop for para iterar sobre a saída de dois comandos canalizados

O Deslumbrante para Loop

a for loop é uma ferramenta de script versátil e fácil de entender. Mas por mais flexível que seja, não se esqueça de que outros loops existem por um motivo. Não se deslumbre pensando no for loop é tudo que você precisa.

a while loop, por exemplo, é muito mais adequado para certas coisas do que o for loop, como ler linhas de um arquivo.

Escrever bons scripts significa usar a ferramenta mais adequada para a tarefa em mãos. a for loop é uma ótima ferramenta para ter em sua caixa de ferramentas de cheats.