Header Ads

Primer: Bash Loops: por, enquanto e até

Shutterstock / jeep5d

A maioria das linguagens de programação oferece suporte a várias formas de loop de linhas de código. O Bash oferece suporte nativo & # 8216; enquanto &’ loops, & # 8216; até &’ loops e os mais conhecidos, & # 8216; para &’ rotações. Este artigo apresenta e discute todos os três.

O que são Bash Loops?

Para definir isso um pouco melhor, devemos começar com a pergunta o que são loops. Loops são uma construção de linguagem de programação, permitindo que um desenvolvedor repita (ou seja, loop) certas partes, ou todo, o código dentro de tal definição de loop. Agora é fácil definir Bash Loops como qualquer construção de linguagem de programação de loop usada no Bash!

O Bash suporta nativamente & # 8216; para ’, & # 8216; até &’ e & # 8216; enquanto &’ loops baseados. Cada um deles tem suas próprias vantagens, mas você já pode ter uma ideia de seus significados apenas observando a palavra principal idioma. Por exemplo, & # 8216; até &’ leva alguém a pensar naturalmente sobre & # 8216; fazer algo até &’ e isso de fato que Bash & # 8216; até &’ loops faz; ele faz um loop em uma certa quantidade de código (ou todo) até que uma determinada condição seja atendida.

Da mesma forma, & # 8216; enquanto &’ os loops continuam em execução até que uma condição não seja mais verdadeira. Finalmente, & # 8216; para &’ loops loop, por exemplo, um número definido de vezes, semelhante a como escreveríamos & # 8216; para 70 vezes, faça … ’. Isso nos ajuda a entender logicamente os recursos exclusivos que cada loop nos fornece e a implementar um código mais legível.

para Loops Bash Baseados

Para os fins deste artigo, daremos uma olhada na forma mais recente de definir os loops for do Bash. Uma definição um pouco mais antiga e menos moderna de loops for no Bash pode, por exemplo, ter a seguinte aparência: for i in $ (seq 1 5); faça echo $ i; feito. Vamos comparar isso com um loop de aparência mais limpo, melhor estruturado e moderno:

 para ((i = 1; i < = 5; i ++)); faça echo $ i; feito 

Este simples para Bash baseado em uma linha (um termo freqüentemente usado em círculos Linux / Bash para conceituar um mini-script escrito em uma única linha) irá imprimir os números de 1 a 5 em ordem sequencial. Definimos um valor inicial para a variável i ($ i) atribuindo o valor 1 ao mesmo, como a primeira parte de nossa definição de loop for, terminado por a; delimitador.

A seguir, especificamos que temos apenas um para ir até & # 8216; menor ou igual a cinco &’ usando i < = 5. Em seguida, indicamos o que deve acontecer no final de cada rodada, e isso é aumentar a variável i em um ou, em uma abreviatura de codificação comumente usada (incluindo na linguagem C ++, por exemplo), isso renderiza como i ++.

Finalmente especificamos o início de nosso código de loop usando do, isto é, após terminar nossa definição de loop for, da mesma forma que qualquer outra terminação de instrução, com; antes de fazer. Também especificamos o final do nosso código de loop usando done e ecoamos (imprimimos) o valor da nossa variável i entre do e done.

Observe também especificamente que a cláusula do em si não termina com; e isso levaria a um erro. Considere fazer um prefixo para o que precisa ser feito e isso faz mais sentido. Esta talvez seja uma das razões pelas quais às vezes é mais limpo colocar coisas em um script de várias linhas, já que fazer pode ser simplesmente a última palavra em uma linha.

Mesmo ao definir outros tipos de loops, ainda manteremos as cláusulas do e done, e sempre teremos certeza de encerrar nossa definição de loop (ou seja, antes do do) com;, bem como encerrar o final de cada instrução individual dentro de nossa definição de loop do ... done com;.

Vamos colocar isso em um pequeno script para ver mais claramente como as coisas podem funcionar dessa maneira:

 #! / bin / bash para ((i = 1; i < = 10; i + = 2)); do echo $ i done 

Depois de tornar o script executável com chmod + x test. sh, executamos o mesmo. Algumas pequenas mudanças foram introduzidas no script. Observe como, desta vez, estamos aumentando a variável i em dois a cada vez. Isso é feito usando outra abreviação de codificação, a saber, i + = 2, que pode ser lido como aumento de i em dois. Também é possível escrever i = i + 2 no mesmo lugar, e funciona exatamente da mesma.

Vemos que começamos em 1 e aumentamos em 2 cada vez que percorremos o loop, terminando em 9. A razão de terminar em 9 é que o valor máximo é 10. Assim, após 9, o próximo valor seria 11, que é maior que 10 e, portanto, não é exibido / em loop.

Observe também como o; foi removido após a linha de eco. Isso porque não há necessidade de encerrar o final de uma instrução se, em vez disso, houver uma situação / caractere de final de linha. Este é o caso aqui; não temos nenhum outro comando após o echo $ i e a linha termina imediatamente (espaços no final da linha também serviriam, o princípio é simplesmente não ter outro comando a menos que esse novo comando seja prefixado (e o anterior encerrado) por;).

enquanto Loops Bash baseados

A seguir, vamos dar uma olhada em um loop Bash – usando a mesma definição de loop do ... done, podemos definir um loop Bash baseado em while que será executado enquanto uma determinada condição for verdadeira.

 i = 1; enquanto [$ i -le 5]; faça echo $ i; i = $ [i + 1]; feito 

Neste exemplo, fazemos o mesmo que nosso primeiro exemplo de loop baseado. Embora a definição pareça mais complexa (e, portanto, um loop for pode ser mais adequado para este caso de uso específico), é interessante ver como podemos definir um loop while da mesma maneira.

Aqui, primeiro definimos nossa variável i, manualmente, em um comando separado terminado por;, para 1. Em seguida, iniciamos um loop while onde definimos uma condição, de forma muito semelhante maneira de definir uma instrução if (há um link no final deste artigo para um artigo sobre instruções if se você quiser saber mais), onde estamos verificando se a variável i é menor ou igual (-le) que 5.

Depois disso, temos nosso bloco faça ... pronto usual no qual ecoamos nossa variável e, subsequentemente, em uma nova instrução, manualmente, aumentamos o valor de nossa variável i em um em um cálculo matemático definido por $ [...] Expressões idiomáticas de cálculo Bash. Vamos dar uma olhada em um loop Bash baseado em até

até loops de bash baseados

Armado com o que aprendemos até agora, podemos agora avaliar mais prontamente o seguinte até o loop Bash baseado:

 i = 1; até [$ i -gt 5]; faça echo $ i; i = $ [i + 1]; feito 

Aqui, procuramos se a condição i maior que 5 se torne verdadeira. Até esse momento (ou seja, um loop baseado em até), imprimiremos (usando echo) nossa variável i e aumentaremos a mesma com um, da mesma forma que nosso exemplo anterior baseado em while.

Podemos ver como a sintaxe do comando until é muito semelhante ao comando while. Observe também que, ao contrário do comando baseado em for, esses comandos procuram uma condição verdadeira para persistir (com while) ou uma condição verdadeira para começar (com até). Isso também permite usar outros comandos que podem retornar uma saída como verdadeiro / falso, como por exemplo grep -q:

 echo 1 > a while grep -q '1' ./a; faça eco 'sim'; dormir 5; feito 

Aqui, adicionamos o número 1 a um arquivo denominado a e verificamos a existência do número 1 dentro desse arquivo usando um grep -q (um grep silencioso). Continuamos fazendo isso (ou seja, enquanto) até que não seja mais verdade. Embora seja verdade, imprimimos o texto sim e pausamos o loop por cinco segundos com sleep 5. Observe como cada comando termina com; de novo.

Após cerca de 17 segundos, interrompemos nosso script usando CTRL + c, que é o método universal para interromper um processo em execução no Bash (além do CTRL + z mais forte e eficaz que pausa um processo imediatamente, mas isso é para outro artigo!)

Concluindo

Neste artigo, revisamos & # 8216; para ’, & # 8216; enquanto &’ e & # 8216; até &’ loops que estão nativamente disponíveis no Bash. Se você estiver interessado em mais Bash, dê uma olhada em Teste condicional em Bash: if, then, else, elif e funções Bash e variáveis ​​locais.

Divirta-se!

Nenhum comentário