Привет, я здесь просто новичок-любитель, так что надеюсь, это не слишком простой вопрос.
Я пытаюсь написать скрипт, который позволит мне генерировать всю файловую структуру для моих медиа, используя только пользовательский ввод. У меня все работает, за исключением строки 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