2010-04-23 52 views
1

我想構建一個腳本(我對linux腳本非常陌生),我似乎無法弄清楚爲什麼我無法運行此腳本。如果我把標題(#!/ bin/sh的)中,我得到以下幾點:CentOS - 將每個WAV文件轉換爲MP3/OGG

-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 

回答

1

你可能實際上有一個非打印字符在那裏。您可能使用「\ r \ n」行結尾而不是常規的UNIX「\ n」結尾在Windows上保存了該文件。使用dos2unix來修復它。此外,只是一些東西......

你似乎沒有引用「$文件」或任何其他變量......所以你的腳本可能工作,如果任何文件名中沒有空格,但如果有空間的話,你可以打賭它會打破。每當你使用一個變量時,確保它保持適當的引用是非常重要的。

與C++和Java不同,shell腳本中的分號用於分隔,而不是終止語句。你不應該在分析結束時加分號;如果要在每行中使用多個語句,則只應使用分號。

有幾種不同的解釋器。如果您使用/bin/sh,則只能保證POSIX所需的最小功能。如果您打算使用BASH特定功能,請使用/bin/bash。作爲一種習慣,我使用#! /bin/bash,除非我絕對需要僅針對/bin/sh,在這種情況下,我還會對我的代碼進行非常全面的檢查,以確保我沒有使用/bin/sh以外的任何功能。

我修正了自己的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 

我不知道到底是什麼你試圖用它的其餘部分做。

+0

非常徹底!謝謝! – Benny 2010-04-23 15:46:11

0

你顯然已經用CRLF行末尾保存了文件,而不是正確的LF行末尾。 ^M是贈品。

將文件更改爲LF行尾。