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

У меня есть следующий сценарий удара, чтобы сделать ряд каталогов, переместиться в тот каталог, выполнить некоторые действия (не показанный) и попятиться до родительского каталога:

#!/bin/bash
if [ -e 'dump' ]; then
        rm -r dump
        mkdir dump
        D="dump/var"
else
        mkdir dump
        D="dump/var"
fi

for d in {1..24}

do
echo $D$d
mkdir $D$d/
cd $D$d
cd ..

done

Когда этот сценарий выполняется, результат состоит в том, что нечетные каталоги сделаны, в то время как четные каталоги бросают ошибку 'Никакой такой файл или каталог'. Если я вставил опцию сделать родительский каталог, как в mkdir -p $D$d/, заканчивается вложенный каталог dump/var1, dump/dump/var2, dump/dump/dump/var3, и так далее.

Если я удаляю изменения каталога, cd $D$d и cd .., затем сценарий выполняется без ошибки. Если я использую полные пути для каталога, как в D="/path/to/directory/dump/var", затем нет 'Никакого такого файла или каталога' для всех кроме первого созданного каталога.

Что происходит в оболочке?

1
задан 14 May 2018 в 20:07

1 ответ

Ядро проблемы: Ваш сценарий cd назад к dump, не к dump/родитель.

На первом повторении:

  • Вы начинаете в dumpродительский каталог, где dump/ существует
  • dump/var1 создается
  • Вы cd в dump/var1.
  • когда cd .. происходит Вы возвращаетесь к dump/. Текущий рабочий каталог dump и существует только var1 там, ничто иное.

На втором повторении:

  • Когда Вы пробуете mkdir dump/var2/ Вы находитесь в dump/ и существует только var1 там. dump/ из dump/var2 несуществующий путь. Конечно, это перестало работать. Следовательно сообщение об ошибке и следовательно дубликат dump/dump/var2 когда Вы используете mkdir -p флаг.
  • Ваш сценарий все еще делает cd .., таким образом, перед 3-м повторением текущий рабочий каталог изменяется от dump/ кому: dump/родитель.

Для 3-го повторения:

  • Вы внутри dump/родительский каталог, путь dump/ существует, следовательно mkdir dump/var3 не перестанет работать.
  • cd dump/var3 происходит, затем cd .., и что ток работает каталог теперь? dump/ , один уровень выше dump/var3, где Вы пытаетесь сделать mkdir dump/dump/var4, но существует только var1 и var3 там, нет dump. mkdir сбои, Вы cd .. который идет один уровень выше dump/, и все это повторяется снова.

Вы видите это ясно при выполнении нашего сценария с set -x для отладочной информации, добавленной после #!/bin/bash строка или путем выполнения pwd как первая команда на каждом повторении сценария.

Путем я рекомендовал бы исправить Ваш сценарий, через cd в dump/ во-первых, и затем выполненный для цикла. Другими словами:

cd "$D"
for i in {1..24}
do
    mkdir "$i"
    cd "$i"
    # do whatever you want inside "$i"
    cd ..
done

Среди прочего я предложил бы использовать [ -d "dump" ] вместо -e, потому что это поможет Вам удостовериться файл, который существует, на самом деле каталог, хотя это могло бы взять дополнительные соображения.

2
ответ дан 7 December 2019 в 13:24

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

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