Expansión de llaves con una variable Bash - {0..$foo}
WEEKS_TO_SAVE=4
mkdir -p weekly.{0..$WEEKS_TO_SAVE}
me da una carpeta llamada semanal.{0..4}
¿Existe algún secreto para la expansión de llaves al crear carpetas que me faltan?
bash
lo hace brace expansion
antes variable expansion
, por lo que obtienes weekly.{0..4}
.
Debido a que el resultado es predecible y seguro ( no confíe en la entrada del usuario ), puede usar eval
en su caso:
$ WEEKS_TO_SAVE=4
$ eval "mkdir -p weekly.{0..$((WEEKS_TO_SAVE))}"
nota :
eval
es malvado- utilizar
eval
con cuidado
Aquí, $((..))
se utiliza para forzar que la variable se evalúe como una expresión entera.
Las llaves no admiten variables en BASH, puedes hacer esto:
for (( c=0; c<=WEEKS_TO_SAVE; c++ ))
do
mkdir -p weekly.${c}
done
Otra forma de hacerlo sin eval y llamando a mkdir sólo una vez:
WEEKS_TO_SAVE=4
mkdir -p $(seq -f "weekly.%.0f" 0 $WEEKS_TO_SAVE)
La expansión de llaves no lo admite. Tendrás que hacerlo mediante un bucle .
La expansión de llaves se realiza antes que cualquier otra expansión y los caracteres especiales de otras expansiones se conservan en el resultado. Es estrictamente textual. Bash no aplica ninguna interpretación sintáctica al contexto de la expansión o al texto entre llaves. Para evitar conflictos con la expansión de parámetros, la cadena '${' no se considera elegible para la expansión de llaves
.