Hola, solo soy un aficionado novato, así que espero que esta no sea una pregunta demasiado simple.
Estoy intentando escribir un script que me permita generar la estructura de archivos completa para mis medios utilizando únicamente las entradas del usuario. Tengo todo funcionando excepto en la línea 20 donde vive 'mkdir Season{1..$user_input4}. Me gustaría tomar el input_4 del usuario y crear 1 + esa cantidad de directorios, pero creo que puedo estar viendo esto desde una perspectiva equivocada, ya que en su lugar crea un subdirectorio llamado Season{1..(imprime la entrada del usuario)}.
#!/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
Si alguien tiene alguna idea, sería muy apreciada. ¡Gracias!
Respuesta1
No funciona de esta manera porque:
El orden de las expansiones es:expansión de corsé; expansión de tilde, parámetro yexpansión variable, (…).
[man bash
, resaltado agregado]
La expansión de llaves ocurre antes de que se expanda la variable y solo se puede ver {1..$user_input4}
, lo que por supuesto no es válido.
Otro posible problema: si $user_input4
resulta ser muy grande y por lo tanto obtienes unmuy largolista de nombres de directorio que puede excederARG_MAX
el límite del caparazón, lo que hará que el comando falle. Puede utilizarlo seq
para crear la secuencia numérica, printf
crear una lista de argumentos delimitada por cero y xargs
llamar mkdir
con tanta frecuencia como sea necesario para solucionarlo. Por supuesto, también es seguro usarlo con una cantidad menor de argumentos, por lo que ese es el camino a seguir si estás tratando con un número desconocido y usuarios desagradables y viciosos:
printf 'Season%s\0' $(seq 1 $user_input4) | xargs -0 mkdir
Si desea que la secuencia numérica termine en $user_input4
+ 1, simplemente reemplace la variable con la expresión aritmética $((user_input4 + 1))
, por ejemplo:
printf 'Season%s\0' $(seq 1 $((user_input4 + 1))) | xargs -0 mkdir
Respuesta2
Que yo sepa, mkdir no acepta una variedad de directorios, al menos no en el formato en el que intenta usarlo. Estás creando las estaciones casi como una matriz. Pero tienes que pasarlos uno a la vez con espacios entre ellos si quieres crear más de un directorio con el comando mkdir.
Dado que está aceptando un valor numérico en user_input4, puede intentar realizar una cuenta regresiva desde el valor de user_input4 hasta llegar a cero usando un bucle while.
while [ $user_input4 -gt 0 ]
do
mkdir Season${user_input4}
let user_input4=${user_input4}-1
done
El bucle se detendrá naturalmente cuando user_input4 sea igual a cero. O si necesita uno más que el número, simplemente use -ge (mayor o igual a). El único inconveniente de este método es que creará los directorios en orden inverso. Entonces, si user_input4 es "3", entonces el orden sería:
mkdir Season3
mkdir Season2
mkdir Season1