Os scripts Bash são um meio altamente eficiente de automatizar tarefas, especialmente aquelas que tiram proveito de outros programas existentes. Esta automação muitas vezes requer a repetição de uma operação semelhante várias vezes, que é precisamente onde o para loop vem por si só.

Os administradores de sistema Linux e Mac geralmente estão familiarizados com scripts por meio do terminal, mas até mesmo os usuários do Windows podem entre em ação com o subsistema Windows para Linux.

Como obter o Linux Bash Shell no Windows 10

Precisa usar o Linux sem tempo para mudar para um PC diferente ou executar uma VM? Em vez disso, execute o Linux no Windows 10 com um terminal shell Bash!

Como funcionam os scripts Bash

Um script bash é simplesmente um arquivo de texto simples contendo uma série de comandos que o shell bash pode ler e executar. Bash é o shell padrão no macOS pré-Catalina e na maioria das distribuições Linux.

Se você nunca trabalhou com um script de shell antes, deve começar com o caso mais simples absoluto. Isso permitirá que você pratique os conceitos-chave, incluindo a criação do script e sua execução.

Primeiro, crie o seguinte arquivo em um local conveniente (de preferência, abra um terminal e navegue até o diretório desejado primeiro):

#! / bin / bash
echo "Olá, mundo"

A primeira linha informa o que quer que execute este programa como executá-lo (ou seja, usando o interpretador bash). O segundo é apenas um comando como qualquer outro que você pode inserir na linha de comando. Salve esse arquivo como hello_world.sh, então:

$ chmod + x hello_world.sh
$ ./hello_world.sh

O chmod O comando na primeira linha torna o arquivo executável, o que significa que pode ser executado digitando seu nome, como na segunda linha.

Se você vir as palavras “Hello, World” impressas em uma linha em seu terminal, então tudo está funcionando conforme necessário.

Como funcionam os loops

Na programação geral, existem dois tipos principais de loop for: numérico e para cada. O tipo numérico é tradicionalmente o mais comum, mas no uso do bash, geralmente é o contrário.

Os loops for numéricos normalmente se concentram em um único inteiro que determina quantas iterações serão realizadas, por exemplo:

para (i = 0; i <100; i ++) {
/ * instruções para executar repetidamente * /
}

Este é um loop for de aparência familiar que irá iterar exatamente 100 vezes, a menos que i seja alterado dentro do loop, ou outra instrução faça com que a execução do loop for seja interrompida.

Os loops Foreach, em contraste, tendem a operar em estruturas como listas ou matrizes e iterar para cada item dentro dessa coleção:

pessoas = ["Pedro", "Paulo", "Maria"]
foreach (pessoas como pessoa) {
if (pessoa == "Paul") {
...
}
}

Alguns idiomas usam uma sintaxe ligeiramente diferente que troca a ordem de coleção e item:

pessoas = ["Pedro", "Paulo", "Maria"]
para (pessoa em pessoas) {
if (pessoa == "Paul") {
...
}
}

For in Loops

No bash, o foreach - ou para em—Loop é mais comum. A sintaxe básica é, simplesmente:

para arg em [lista]
Faz
/ * instruções para executar repetidamente * /
/ * o valor de arg pode ser obtido usando $ arg * /
feito

Por exemplo, para iterar por meio de três arquivos nomeados explicitamente:

para arquivo em one.c two.c three.c
Faz
ls "$ file"
feito

Se esses arquivos existirem no diretório atual, a saída deste script será:

um C
two.c
three.c

Em vez de um conjunto fixo de arquivos, a lista pode ser obtida por meio de um padrão glob (um incluindo curingas - caracteres especiais que representam outros caracteres). No exemplo a seguir, o loop for itera em todos os arquivos (no diretório atual) cujos nomes terminam em ".xml":

para arquivo em * .xml
Faz
ls -l "$ file"
feito

Aqui está um exemplo de saída:

$ -rw-r - r-- 1 bobby staff 2436 3 de novembro de 2019 feed.xml
$ -rw-r - r-- 1 bobby staff 6447 27 Out 16:24 sitemap.xml

Isso pode se parecer muito com uma maneira prolixa de fazer:

$ ls -l * .xml

Mas há uma diferença significativa: o loop for executa o ls programa 2 vezes diferentes, com um único nome de arquivo transmitido a ele a cada vez. No exemplo ls separado, o padrão glob (* .xml) corresponde aos nomes de arquivo primeiro e, em seguida, envia todos eles, como parâmetros de linha de comando individuais, para uma instância de ls.

Aqui está um exemplo que usa o banheiro (contagem de palavras) programa para tornar a diferença mais óbvia:

$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 no total

O banheiro o programa conta o número de linhas em cada arquivo separadamente e, em seguida, imprime uma contagem total em todos eles. Em contraste, se banheiro opera dentro de um loop for:

para arquivo em * .xml
Faz
wc -l $ arquivo
feito

Você ainda verá a contagem de cada arquivo:

44 feed.xml
231 sitemap.xml

Mas não há resumo geral total porque banheiro é executado isoladamente, sempre que o loop itera.

Quando uma lista não é uma lista

Há um erro muito fácil e comum ao lidar com loops for, devido à maneira como o bash lida com argumentos / strings entre aspas. O loop em uma lista de arquivos deve ser feito assim:

para arquivo em one.c two.c

Assim não:

para arquivo em "one.c two.c"

O segundo exemplo inclui nomes de arquivos entre aspas duplas, o que resulta em uma lista com apenas um único parâmetro; o loop for será executado apenas uma vez. Este problema pode ser evitado usando uma variável em tais casos:

ARQUIVOS = "um.c dois.c"
para arquivo em $ FILES
Faz
...
feito

Observe que a própria declaração da variável precisa colocar seu valor entre aspas duplas!

Para sem uma lista

Sem nada para iterar, um loop for opera em quaisquer argumentos de linha de comando fornecidos ao script quando invocado. Por exemplo, se você tiver um script chamado args.sh contendo o seguinte:

#! / bin / sh
para
Faz
echo $ a
feito

Em seguida, executar args.sh fornecerá o seguinte:

$ ./args.sh um dois três
1
dois
três

Bash reconhece este caso e trata para fazer como o equivalente a para um em $ @ do onde $ @ é uma variável especial que representa os argumentos da linha de comando.

Emulando um Loop For Numérico Tradicional

Os scripts Bash geralmente lidam com listas de arquivos ou linhas de saída de outros comandos, portanto, o tipo de loop for in é comum. No entanto, a operação tradicional de estilo c ainda é compatível:

para ((i = 1; i <= 5; i ++))
Faz
echo $ i
feito

Esta é a forma clássica com três partes nas quais:

  1. uma variável é inicializada (i = 1) quando o loop é encontrado pela primeira vez
  2. o loop continua enquanto a condição (i <= 5) for verdadeira
  3. a cada volta do loop, a variável é incrementada (i ++)

A iteração entre dois valores é um requisito comum o suficiente para que haja uma alternativa mais curta e um pouco menos confusa:

para i em {1..5}
Faz
echo $ i
feito

A expansão da chave que ocorre efetivamente traduz o loop for acima em:

para i em 1 2 3 4

Controle de Loop Mais Fino com Break e Continue

Os loops for mais complexos geralmente precisam de uma maneira de sair mais cedo ou de reiniciar imediatamente o loop principal com o próximo valor por sua vez. Para fazer isso, o bash usa as instruções break e continue que são comuns em outras linguagens de programação. Aqui está um exemplo que usa ambos para encontrar o primeiro arquivo com mais de 100 caracteres:

#! / bin / bash
para arquivo em *
Faz
E se [! -f "$ file"]
então
echo "$ file não é um arquivo"
Prosseguir
fi
num_chars = $ (wc -c echo $ file tem "$ num_chars characters long"
if [$ num_chars -gt 100]
então
echo "Found $ file"
intervalo
fi
feito

O loop for aqui opera em todos os arquivos no diretório atual. Se o arquivo não for um arquivo regular (por exemplo, se for um diretório), a instrução continue é usada para reiniciar o loop com o próximo arquivo por vez. Se for um arquivo normal, o segundo bloco condicional determinará se ele contém mais de 100 caracteres. Nesse caso, a instrução break é usada para sair imediatamente do loop for (e chegar ao final do script).

Conclusão

Um script bash é um arquivo que contém um conjunto de instruções que podem ser executadas. Um loop for permite que parte de um script seja repetido muitas vezes. Com o uso de variáveis, comandos externos e as instruções break e continue, os scripts bash podem aplicar uma lógica mais complexa e realizar uma ampla gama de tarefas.

O email
As etiquetas de privacidade de aplicativos da Apple podem não ser totalmente precisas

O relatório sugere que os rótulos de privacidade de aplicativos da Apple podem ter alguns problemas.

Tópicos relacionados
  • Programação
  • Linux
Sobre o autor
Bobby Jack (19 artigos publicados)

Bobby é um entusiasta da tecnologia que trabalhou como desenvolvedor de software por quase duas décadas. Ele é apaixonado por jogos, trabalha como Editor de Críticas na Switch Player Magazine e está imerso em todos os aspectos da publicação online e desenvolvimento web.

Mais de Bobby Jack

Assine a nossa newsletter

Junte-se ao nosso boletim informativo para dicas técnicas, análises, e-books grátis e ofertas exclusivas!

Mais um passo…!

Confirme o seu endereço de e-mail no e-mail que acabamos de enviar.

.