Переименовать некоторые файлы в определенном формате

Эту ошибку трудно отследить в реальных ситуациях. Здесь я предлагаю одно решение для реальных -ситуаций. Я буду использовать свой сценарий в качестве примера.

Я обновил сценарий оболочки. При его выполнении я получил следующее сообщение об ошибке:

/somepath/bin/myshellscript: line 1508: unexpected EOF while looking for matching `"'
/somepath/bin/myshellscript: line 1520: syntax error: unexpected end of file

line 1508 elif [ "$project" ]; then

Это последняя строка с парой двойных кавычек.

Обычно я проверяю сценарий оболочки каждый раз, когда его изменяю. На этот раз я подождал один день и забыл, где я сделал модификацию. Проблема возникла в любом месте до этой строки (1508 ). Проблема в том, что даже я прокомментировал схему 1508

#elif [ "$project" ]; then

палач все еще говорил, что в строке 1508 есть проблемы.

Затем я сделал копию исходного сценария оболочки. Удаление целой кучи кода снизу. Затем проверьте мой код с помощью следующей команды

bash -n mysbashscript

mybashscript: line 515: unexpected EOF while looking for matching `"'
mybashscript: line 561: syntax error: unexpected end of file

Теперь размер моего файла составляет 1/3 от исходного размера. Я сразу увидел проблему:

497 prepare_alignment() {
498     local projdir=${1:?"did not give project directory"}
499     local samp=${2:?"did not give sample name"}
500     local merged=${3:?"must give merged bam file name} # here is the problem

По какой-то причине несопоставленный "внутри {}не захватывается синтаксическим анализатором оболочки. Здесь парсер оболочки может быть улучшен.

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

Если проблема во второй половине, отменить удаление. Повторите этот процесс. Вы можете сузить до меньшего размера, чтобы найти источник проблемы.

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

Вы можете использовать bash -n script_nameили просто выполнить скрипт напрямую. Оба должны работать. (здесь имя сценария _просто fooscript или barscript для иллюстрации, а не настоящее имя сценария и должно состоять из одного слова ).

0
29.07.2020, 16:36
2 ответа

Использование Perl-инструмента переименования:

rename -n 's/(....)(.)/$1_biounit$2/' ?????.pdb

Удалите -n, если вас устраивает результат.

3
18.03.2021, 23:16

С петлей-раковиной:

for f in ?????.pdb; do mv "$f" "${f%?.pdb}_biounit${f#????}"; done
  • ${f%?.pdb}удаляет ?.pdbиз конца имени файла.
  • ${f#????}удаляет ????из начала имени файла.
4
18.03.2021, 23:16

Теги

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