Ошибки Bash-скрипта

1287
Desd

Я пытаюсь получить все мои MP3 для регистрации BPM. Я нашел программное обеспечение для этого через этот вопрос Супер пользователя .

Я установил bpmdj, vorbis-tools flac python-mutagenи скопировал Баш скрипт с именем Super User вопроса (см . Ниже) Теперь проблема в том, что этот скрипт дает мне две ошибки:

  1. /home/jeroen/bpmtagging.sh: line 67: warning: here-document at line 4 delimited by end-of-file (wantedHELP ') `
  2. /home/jeroen/bpmtagging.sh: line 68: syntax error: unexpected end of file

Это последние две строки сценария. Я предполагаю, что скрипт работал для OP, но теперь больше не работает на Ubuntu 12.04.

Я новичок в сценариях Bash, и я попытался найти ошибки, но безрезультатно. Любая помощь будет оценена.

#!/bin/bash  function display_help() { cat <<-HELP Recursive BPM-writer for multicore CPUs. It analyzes BPMs of every media file and writes a correct tag there. Usage: $(basename "$0") path [...] HELP exit 0 }  [ $# -lt 1 ] && display_help  #=== Requirements requires="bpmcount mid3v2 vorbiscomment metaflac" which $requires > /dev/null || { echo "E: These binaries are required: $requires" >&2 ; exit 1; }  #=== Functions  function bpm_read(){ local file="$1" local ext="$" declare -l ext # Detect { case "$ext" in 'mp3') mid3v2 -l "$file" ;; 'ogg') vorbiscomment -l "$file" ;; 'flac') metaflac --export-tags-to=- "$file" ;; esac ; } | fgrep 'BPM=' | cut -d'=' -f2 } function bpm_write(){ local file="$1" local bpm="$" local ext="$" declare -l ext echo "BPM=$bpm @$file" # Write case "$ext" in 'mp3') mid3v2 --TBPM "$bpm" "$file" ;; 'ogg') vorbiscomment -a -t "BPM=$bpm" "$file" ;; 'flac') metaflac --set-tag="BPM=$bpm" "$file" mid3v2 --TBPM "$bpm" "$file" # Need to store to ID3 as well :( ;; esac }  #=== Process function oneThread(){ local file="$1" #=== Check whether there's an existing BPM local bpm=$(bpm_read "$file") [ "$bpm" != '' ] && return 0 # there's a nonempty BPM tag #=== Detect a new BPM # Detect a new bpm local bpm=$(bpmcount "$file" | grep '^[0-9]' | cut -f1) [ "$bpm" == '' ] && { echo "W: Invalid BPM '$bpm' detected @ $file" >&2 ; return 0 ; } # problems # Write it bpm_write "$file" "$" >/dev/null }  NUMCPU="$(grep ^processor /proc/cpuinfo | wc -l)" find $@ -type f -regextype posix-awk -iregex '.*\.(mp3|ogg|flac)' \ | while read file ; do [ `jobs -p | wc -l` -ge $NUMCPU ] && wait echo "$file" oneThread "$file" & done 
2

1 ответ на вопрос

2
slhck

Скрипт содержит heredoc, который есть <<-HELP. Это позволяет вам включать буквенные строки между двумя идентификаторами. Этот идентификатор указывается после <<, и это HELP.

В имеющемся у вас скрипте есть специальный синтаксический элемент с -промежуточным <<и идентификатором. Это позволяет идентифицировать идентификатор, даже если он имеет отступ с помощью вкладок, так что вы можете написать:

cat <<-HELP some indented text ___HELP 

Здесь ___будет вкладка. Теперь, в вашем случае, он, вероятно, имеет несколько пробелов, поэтому конец heredoc не найден.

Для этого есть два решения:

  • Измените отступ от пробелов до вкладок.
  • Переместить HELPидентификатор в начало строки.

Если вы используете редактор с правильной подсветкой синтаксиса (или тот, который показывает пробелы и табуляции), вы должны увидеть эту ошибку:

Спасибо! Это сработало. Я изменил пробелы на вкладку. Я сомневаюсь, что нашел бы это самостоятельно. Desd 11 лет назад 0
Нет проблем! Обновил мой ответ скриншотом от редактора - если он имеет правильную подсветку синтаксиса, вы сможете обнаружить эти вещи! slhck 11 лет назад 0