CentOS - конвертировать каждый WAV-файл в MP3 / OGG - PullRequest
1 голос
/ 23 апреля 2010

Я пытаюсь создать сценарий (я довольно новичок в сценариях Linux) и не могу понять, почему я не могу запустить этот сценарий.Если я сохраню заголовок (#! / Bin / sh), я получу следующее:

-bash: /tmp/ConvertAndUpdate.sh: /bin/sh^M: bad interpreter: No such file or directory

Если я достану его, я получу следующее:

'tmp/ConvertAndUpdate.sh: line 2: syntax error near unexpected token `do
'tmp/ConvertAndUpdate.sh: line 2: `do

Любойидеи?Вот полный сценарий:

#!/bin/sh
for file in *.wav; do
    mp3=$(basename .$file. .wav).mp3;
    #echo $mp3
    nice lame -b 16 -m m -q 9 .resample 8 .$file. .$mp3.;
    touch .reference .$file. .$mp3.;
    chown apache.apache .$mp3.;
    chmod 600 .$mp3.;
    rm -f .$file.;
    mv .$file. /converted;
    sql="UPDATE recordings SET IsReady=1 WHERE Filename='${file%.*}'"
    echo $sql | mysql --user=me --password=pasword Recordings
    #echo $sql
done

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

У вас может быть непечатный символ.Вы, вероятно, сохранили этот файл в Windows с окончаниями строк "\ r \ n" вместо обычных окончаний UNIX "\ n".Используйте dos2unix, чтобы исправить это.Кроме того, только некоторые вещи ....

Вы, кажется, не заключаете в кавычки "$ file" или любую из этих других переменных ... так что ваш скрипт может работать, если в какой-либо из них нет пробеловимена файлов, но вы можете поспорить, что он сломается, если есть пробелы.Всякий раз, когда вы используете переменную, очень важно убедиться, что она остается правильно заключенной в кавычки.

В отличие от C ++ и Java, точка с запятой в сценариях оболочки используется для разделения, а не завершения операторов.Вы не должны ставить точки с запятой в конце утверждений;Вы должны использовать только точки с запятой, если вы хотите использовать более одного оператора в строке.

Есть несколько разных переводчиков.Если вы используете /bin/sh, вам гарантированы только те минимальные функции, которые требуются POSIX.Если вы планируете использовать специфичные для BASH функции, используйте /bin/bash.Как правило, я использую #! /bin/bash, если только мне абсолютно не нужно нацеливаться на /bin/sh, и в этом случае я также делаю очень тщательный анализ своего кода, чтобы убедиться, что я не использую какие-либо функции, кроме /bin/sh.

Я исправил часть вашего сценария оболочки следующим образом:

#! /bin/bash
for file in *.wav; do
    filebasename=`basename "$file" .wav`
    filemp3="$filebasename.mp3"
    nice lame -b 16 -m m -q 9 --resample 8 "$file" "$filemp3"
    #....
done

Я не совсем уверен, что вы пытались делать с остальным.

0 голосов
/ 23 апреля 2010

Вы, очевидно, сохранили файл с окончаниями строк CRLF вместо правильных окончаний строк LF.^M - это дешевая распродажа.

Измените файл на конец строки LF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...