Núcleo do problema: seu script cd volta para dump , não para dump/ pai.
Na primeira iteração:
- Você começa no diretório pai de
dump, ondedump/existe -
dump/var1é criado - você
cdintodump/var1. - quando ocorre
cd .., você volta paradump/. O diretório de trabalho atual édumpe há apenasvar1, nada mais.
Na segunda iteração:
- Quando você tenta
mkdir dump/var2/, está emdump/e há apenasvar1. Odump/dedump/var2é o caminho inexistente. Claro que falha. Daí a mensagem de erro e, portanto, a duplicatadump/dump/var2quando você usamkdir -pflag. - Seu script ainda usa
cd .., portanto, antes do diretório de trabalho atual da 3ª iteração ser alterado dedump/paradump/.
Para a terceira iteração:
- Você está dentro do diretório pai de
dump/, o caminhodump/existe e, portanto,mkdir dump/var3não falhará. -
cd dump/var3ocorre, entãocd ..e qual é o diretório de trabalho atual agora?dump/, o nível acima dedump/var3, em que você tenta fazermkdir dump/dump/var4, mas há apenasvar1evar3, nãodump. Omkdirfalha, vocêcd .., que está um nível acima dedump/, e a coisa toda é repetida novamente.
Você pode ver isso claramente quando executar nosso script com set -x para depuração de saída anexada após #!/bin/bash line ou fazendo pwd como primeiro comando em cada iteração do script.
A maneira que eu recomendaria corrigir seu script é através de cd em dump/ primeiro e, em seguida, executar o loop for. Em outras palavras:
cd "$D"
for i in {1..24}
do
mkdir "$i"
cd "$i"
# do whatever you want inside "$i"
cd ..
done
Entre outras coisas, sugiro usar [ -d "dump" ] em vez de -e , porque isso ajudará a garantir que o arquivo que existe realmente seja o diretório, embora isso possa levar considerações extras.