Definindo o ponto inicial e final de um loop no bash

5

Eu tenho um diretório com pastas numeradas sequencialmente de 1-1000, no entanto, quero executar uma ação para algumas das pastas nesse diretório. ou seja, pastas 1-50. Como faço para definir o ponto inicial e final do loop?

Até agora eu tenho um roteiro ao longo destas linhas:

a=1
b=1

for i in ~/PATH/*/ ;do

(cd $i/ && action)

echo "completed"
a='expr $a + $b'

echo "Next Folder"
done

Eu posso definir o início do loop mudando a = mas não tenho certeza de como definir o final do loop? Da forma como está, continuará passando por todas as pastas desse diretório. Obrigado :)

    
por Jyosk 25.07.2016 / 16:19

5 respostas

4
#!/bin/bash
a=1
b=1

cd ~/PATH/
for i in $(ls -v) ;do
  (cd $i/ && action) && echo "completed" || echo "error"
  a=$((a+b)); [ "$a" -gt 50 ] && break 
  echo "Next Folder"
done
    
por 25.07.2016 / 16:31
7

Usando o comando seq para gerar a lista sobre a qual iterar:

for nn in $(seq 1 50) ; do
    (cd someprefix/$nn && action)
done

Ou, se o seu shell for compatível com expansão de chaves :

for nn in {1..50} ; do
    (cd someprefix/$nn && action)
done
    
por 25.07.2016 / 16:29
4

O comando break permite que você saia de um loop.

Então você faria algo assim, depois de definir a

if [ $a -gt 50 ]
then
  break
fi
    
por 25.07.2016 / 16:26
4

O Bash permite loops parecidos com o padrão C for -loop:

for (( i = 1; i <= 50; ++i )); do
  ( cd $i && action )
done

Altere cd $i para cd "$HOME/PATH/$i" ou qualquer que seja o caminho para seus diretórios.

    
por 25.07.2016 / 16:26
2

Você pode até fazer um loop while:

a=1
while [ $a -le 50 ]; do
   (cd $a/ && action) 
   a=$((a+1))
done

Ou, alternativamente:

a=1
while (( ++a<=50 ));do
   (cd $a/ && action) 
done
    
por 25.07.2016 / 16:35

Tags