Здравствуйте, просто любитель нубов, так что, надеюсь, это не слишком простой вопрос.
Я пытаюсь написать сценарий, который позволит мне сгенерировать всю файловую структуру для моего носителя, используя только пользовательский ввод. У меня все работает, кроме строки 20, где живет 'mkdir Season {1 .. $ user_input4}. Я хотел бы, чтобы он взял user input_4 и сделал 1 + столько каталогов, но я чувствую, что могу смотреть на это с неправильной точки зрения, поскольку вместо этого создается подкаталог с именем Season {1 .. (печатает ввод пользователя)}. 112]
#!/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
Если у кого-то есть идеи, они будут очень благодарны. Спасибо!
Это не работает таким образом, потому что:
Порядок разложений: скобка ; расширение тильды, параметр и расширение переменной , (…).
blockquote>
[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
Насколько мне известно, 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