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.
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:
- uma variável é inicializada (i = 1) quando o loop é encontrado pela primeira vez
- o loop continua enquanto a condição (i <= 5) for verdadeira
- 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 relatório sugere que os rótulos de privacidade de aplicativos da Apple podem ter alguns problemas.
- Programação
- Linux

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.
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.