CentOS - 将每个WAV文件转换为MP3 / OGG

时间:2010-04-23 13:39:22

标签: linux scripting

我正在尝试构建一个脚本(我对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 个答案:

答案 0 :(得分:1)

你可能实际上有一个非打印字符。您可能在Windows上使用“\ r \ n”行结尾而不是常规UNIX“\ n”结尾保存此文件。使用dos2unix来修复它。还有,只是一些事情......

您似乎没有引用“$ file”或任何其他变量...所以如果任何文件名中没有空格,您的脚本可能会有效,但您可以打赌它会破坏是空格。无论何时使用变量,确保其保持正确引用非常重要。

与C ++和Java不同,shell脚本中的分号用于分隔而不是终止语句。你不应该在陈述的末尾加上分号;如果要每行使用多个语句,则只应使用分号。

有几种不同的口译员。如果您使用/bin/sh,则只能保证POSIX所需的最低功能。如果您计划使用BASH特定功能,请使用/bin/bash。作为一种习惯,我使用#! /bin/bash,除非我绝对需要仅针对/bin/sh,在这种情况下,我还会对我的代码进行彻底的审核,以确保我没有使用{{1}以外的任何功能{1}}。

我修复了shell脚本的一部分,如下所示:

#! /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

我不确定你正在尝试用剩余的东西做什么。

答案 1 :(得分:0)

您显然已使用CRLF行结尾保存文件,而不是正确的LF行结尾。 ^M是赠品。

将文件更改为LF行结尾。