BASH - поиск файла для проблемы цикла - PullRequest
0 голосов
/ 30 апреля 2019

Итак, проблема в следующем: У меня есть папка с 4 .zip и .md5 для всех с одинаковым базовым именем файла.

У меня есть цикл FOR:

for S in *.zip;
do  
    {
        check_md5
    }
done

check_md5 ()
{
    if md5sum -c ${S:0:-4}.md5;
    then
        unzip_file
    else
        echo "MD5 failed"
    fi
}

Проблема: скрипт для первого zip-файла работает нормально, но когда процесс unzip_file завершается, он не обновляет переменную S до имени файла следующего zip-файла.

Во время процесса unzip_file он перемещается из исходной папки и в конце перемещает текущие 'S' .zip и .md5 в папку архива.

Возможно ли, что ошибка возникает из-за того, что сценарий unzip_file перемещается из исходной папки или потому, что он перемещает первые .zip и .md5 из исходной папки, прежде чем перейти к следующему циклу?

Есть еще идеи?

Заранее спасибо.

1 Ответ

0 голосов
/ 30 апреля 2019

Проблема в конце первой итерации, в которой вы оказались в другом каталоге. Ниже приводится одно из возможных исправлений.

CWD="$PWD"  # remember current working directory path
for S in *.zip; do
    check_md5
    cd "$CWD"  # come back to the initial working directory at the end of each iteration
done

Хотя это и не связано с вопросом, я бы предпочел передать имя файла функции, а не обращаться к набору переменных в другом месте. Мне трудно устранять неполадки и более склонны к ошибкам.

unzip_file()
{
    echo "unzipping $1"
    # ...
}

check_md5()
{
    if md5sum -c "${1:0:-4}.md5"; then
        unzip_file "$1"  # pass the argument forward
    else
        echo "MD5 failed"
    fi
}

CWD="$PWD"  # remember current working directory path
for S in *.zip; do
    check_md5 "$S"  # pass file name as an argument
    cd "$CWD"  # come back to the initial working directory
done

Как еще одно замечание, ваша функция именования / модульности выглядит не очень хорошо. например check_md5 делает гораздо больше, чем просто проверяет md5 сумму.

...