1

Я пытаюсь написать сценарий Bash для автоматизации повторяющейся задачи, а именно создания структуры папок, где некоторые из них должны быть пронумерованы (если быть более точным, это предназначено для архивирования некоторых сериалов, которые я преобразовал с DVD в структуре папок, легко понятной для медиаплеера Kodi)

Первая попытка была такой:

echo "Insert the title of the series"
read title

mkdir $title
mkdir $title/extrafanart
mkdir $title/themes
mkdir $title/videoextras

for num in {1..3}
do
  mkdir $title/"Season $num"
done

Это правильно создает следующую структуру, в примере

Star Trek
Star Trek\extrafanart
Star Trek\Season 1
Star Trek\Season 2
Star Trek\Season 3
Star Trek\themes
Star Trek\videoextras

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

echo "Insert the title of the series"
read title
echo "Insert the number of seasons"
read seasons

mkdir $title
mkdir $title/extrafanart
mkdir $title/themes
mkdir $title/videoextras

for num in {1..$seasons}
do
  mkdir $title/"Season $num"
done

На этот раз результат не совсем то, что я ожидал, это то, что я получаю

Star Trek
Star Trek\extrafanart
Star Trek\Season {1..3}
Star Trek\themes
Star Trek\videoextras

что не то, что мне нужно.

Я предполагаю, что проблема в первой строке цикла for , где расширение скобки читается оболочкой как строка, а не как выражение для оценки. Я прав?

Что не так и как я могу исправить этот скрипт?

1 ответ1

2

Используйте цикл:

num=1
while [ $num -le $seasons ]; do
  mkdir $title/"Season $num"
  num=$[ $num + 1 ]
done

объяснение

Мы используем оператор [test и оператор оценки $ [(они похожи, но совершенно разные). [ $num -le $seasons ] проверяет, является ли $ num L ess или E qual чем $ seasons; $[ $num + 1 ] добавляет единицу к числовому значению $ num и присваивает его обратно $ num.

Для получения информации об операторе теста введите help test в командной оболочке bash. Оператор оценки объясняется в руководстве по bash (man bash , будьте осторожны, это долго). Вы также можете использовать его для вычитания, умножения, деления и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .