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