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