#!/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
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 :)
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
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
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.
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
Tags bash