【问题标题】:CentOS - Convert Each WAV File to MP3/OGGCentOS - 将每个 WAV 文件转换为 MP3/OGG
【发布时间】:2010-04-23 21:53:31
【问题描述】:

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

【问题讨论】:

    标签: linux scripting


    【解决方案1】:

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

    您似乎没有引用“$file”或任何其他变量...因此,如果任何文件名中没有空格,您的脚本可能会工作,但您可以打赌,如果有的话,它会中断是空格。每当您使用变量时,确保它保持正确引用非常重要。

    与 C++ 和 Java 不同,shell 脚本中的分号用于分隔而不是终止语句。你不应该把分号放在语句的末尾;如果您想每行使用多个语句,则应仅使用分号。

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

    我已将您的部分 shell 脚本修复如下:

    #! /bin/bash 对于 *.wav 中的文件;做 filebasename=`basename "$file" .wav` filemp3="$filebasename.mp3" 不错的跛脚 -b 16 -m m -q 9 --resample 8 "$file" "$filemp3" #.... 完毕

    我不确定你想用剩下的部分做什么。

    【讨论】:

      【解决方案2】:

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

      将文件更改为 LF 行结尾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 2013-07-06
        • 2017-02-22
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        相关资源
        最近更新 更多