Создание скриптов каталогов и подкаталогов на основе ввода данных пользователем

Создание скриптов каталогов и подкаталогов на основе ввода данных пользователем

Привет, я здесь просто новичок-любитель, так что надеюсь, это не слишком простой вопрос.

Я пытаюсь написать скрипт, который позволит мне генерировать всю файловую структуру для моих медиа, используя только пользовательский ввод. У меня все работает, за исключением строки 20, где находится 'mkdir Season{1..$user_input4}. Я хотел бы, чтобы он принимал пользовательский ввод_4 и создавал 1 + столько каталогов, но мне кажется, что я смотрю на это с неправильной точки зрения, поскольку вместо этого он создает подкаталог с именем Season{1..(выводит пользовательский ввод)}.

#!/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

Если у кого-то есть идеи, буду очень признателен. Спасибо!

решение1

Это так не работает, потому что:

Порядок расширений следующий:расширение скобки; расширение тильды, параметр ипеременное расширение, (…).
[man bash, добавлено выделение]

Раскрытие фигурных скобок происходит до раскрытия переменной и может видеть только {1..$user_input4}, что, конечно, недопустимо.

Другая возможная проблема: если $user_input4он очень большой, то вы получаетеочень длинныйсписок имен каталогов, которые вы можете превыситьARG_MAXпредел оболочки, что приведет к сбою команды. Вы можете использовать seqдля создания числовой последовательности, printfдля создания списка аргументов, разделенных нулем, и xargsвызывать mkdirтак часто, как это необходимо, чтобы обойти это. Конечно, это безопасно использовать и с меньшим количеством аргументов, так что это способ, если вы имеете дело и с неизвестным номером, и с противными злобными пользователями:

printf 'Season%s\0' $(seq 1 $user_input4) | xargs -0 mkdir

Если вы хотите, чтобы числовая последовательность заканчивалась на $user_input4+ 1, просто замените переменную арифметическим выражением $((user_input4 + 1)), например:

printf 'Season%s\0' $(seq 1 $((user_input4 + 1))) | xargs -0 mkdir

решение2

Насколько мне известно, mkdir не принимает диапазон каталогов, по крайней мере, не в том формате, который вы пытаетесь использовать. Вы создаете сезоны почти как массив. Но вам придется передавать их по одному с пробелами между ними, если вы хотите создать более одного каталога с помощью команды mkdir.

Поскольку вы принимаете числовое значение в user_input4, вы можете попробовать отсчитать значение от user_input4 до тех пор, пока не достигнете нуля, используя цикл while.

while [ $user_input4 -gt 0 ]
do
  mkdir Season${user_input4}
  let user_input4=${user_input4}-1
done

Цикл естественным образом остановится, когда user_input4 будет равен нулю. Или, если вам нужно на единицу больше, чем число, просто используйте -ge (больше или равно). Единственная загвоздка с этим методом в том, что он создаст каталоги в обратном порядке. Так что если user_input4 равен "3", то порядок будет следующим:

mkdir Season3
mkdir Season2
mkdir Season1

Связанный контент