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

Здравствуйте, просто любитель нубов, так что, надеюсь, это не слишком простой вопрос.

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

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

1
задан 22 May 2019 в 00:19

2 ответа

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

Порядок разложений: скобка ; расширение тильды, параметр и расширение переменной , (…).
[ 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
0
ответ дан 22 May 2019 в 00:19

Насколько мне известно, 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
0
ответ дан 22 May 2019 в 00:19

Другие вопросы по тегам:

Похожие вопросы: