Olá, apenas um amador novato aqui, então espero que esta não seja uma pergunta muito simples.
Estou tentando escrever um script que me permita gerar toda a estrutura de arquivos da minha mídia usando apenas entradas do usuário. Tenho tudo funcionando, exceto a linha 20, onde reside o 'mkdir Season{1..$user_input4}. Eu gostaria que ele pegasse o usuário input_4 e criasse 1 + esse número de diretórios, mas sinto que posso estar olhando isso da perspectiva errada, pois em vez disso ele cria um subdiretório chamado Season{1..(imprime a entrada do usuário)}.
#!/bin/bash
file_created="Directory Created"
directory_number=0
echo "How many directories should be created?"
read user_input
while [ $directory_number -ne $user_input ]
do
echo "Enter Directory Name"
read user_input2
mkdir $user_input2
directory_number=$((directory_number + 1))
echo "Do you want to create Seasons? Y/N"
read user_input3
if [ $user_input3 == "Y" ]
then
echo "Enter number of seasons"
read user_input4
cd $user_input2/
mkdir Season{1..$user_input4}
cd ..
else
:
fi
done
Se alguém tiver alguma idéia, seria muito apreciada. Obrigado!
Responder1
Não funciona assim porque:
A ordem das expansões é:expansão de cinta; expansão de til, parâmetro eexpansão variável, (…).
[man bash
, destaque adicionado]
A expansão de chaves acontece antes da variável ser expandida e só pode ser vista {1..$user_input4}
, o que obviamente não é válido.
Outro possível problema: se $user_input4
acontecer de ele ser muito grande e você conseguir ummuito longolista de nomes de diretório que você pode excederARG_MAX
o limite do shell, o que fará com que o comando falhe. Você pode usar seq
para criar a sequência numérica, printf
para criar uma lista de argumentos delimitados por zero e xargs
para chamar mkdir
quantas vezes for necessário para contornar isso. É claro que também é seguro usar com um número menor de argumentos, então esse é o caminho a seguir se você estiver lidando com um número desconhecido e com usuários desagradáveis e cruéis:
printf 'Season%s\0' $(seq 1 $user_input4) | xargs -0 mkdir
Se quiser que a sequência numérica termine em $user_input4
+1, basta substituir a variável pela expressão aritmética $((user_input4 + 1))
, ex.:
printf 'Season%s\0' $(seq 1 $((user_input4 + 1))) | xargs -0 mkdir
Responder2
Que eu saiba, o mkdir não aceita uma variedade de diretórios, pelo menos não no formato que você está tentando usar. Você está criando as estações quase como uma matriz. Mas você deve passá-los um de cada vez com espaços entre eles se quiser criar mais de um diretório com o comando mkdir.
Como você está aceitando um valor numérico em user_input4, você pode tentar fazer uma contagem regressiva a partir do valor de user_input4 até chegar a zero usando um loop while.
while [ $user_input4 -gt 0 ]
do
mkdir Season${user_input4}
let user_input4=${user_input4}-1
done
O loop irá parar naturalmente quando user_input4 for igual a zero. Ou se você precisar de um a mais que o número, basta usar -ge (maior ou igual a). O único problema desse método é que ele criará os diretórios na ordem inversa. Portanto, se user_input4 for "3", a ordem seria:
mkdir Season3
mkdir Season2
mkdir Season1