Shell脚本语法错误:意外的行结束

时间:2012-10-05 21:11:38

标签: bash shell cygwin

我编写了一个简单的shell脚本来检查是否存在xml文件,如果它存在,则将旧的xml文件重命名为backup,然后将新的xml文件移动到旧的xml文件所在的位置。

#!/bin/sh    

oldFile="/Documents/sampleFolder/sampleFile.xml"
newFile="/Documents/sampleFile.xml"
backupFileName="/Documents/sampleFolder/sampleFile2.backup"
oldFileLocation="/Documents/sampleFolder"

if [ -f "$newFile" ] ; then
    echo "File found"
    #Rename old file
    mv $oldFile $backupFileName
    #move new file to old file's location
    mv $newFile $oldFileLocation
else
    echo "File not found, do nothing"
fi   

但是,每次我尝试运行脚本时,都会收到4个命令未找到的消息和语法错误:意外的文件结束。有关为什么我没有找到这些命令错误或意外结束文件的任何建议?我仔细检查了我关闭了所有双引号,我的代码突出显示:)

编辑:     运行脚本的输出:

: command not found: 
: command not found: 
: command not found1: 
: command not found6: 
replaceXML.sh: line 26: syntax error: unexpected end of file

3 个答案:

答案 0 :(得分:8)

我相信你正在使用Cygwin。错误消息的内容多于您所看到的内容:

: command not found: 
: command not found: 
: command not found1: 
: command not found6: 
replaceXML.sh: line 26: syntax error: unexpected end of file

您可能使用Windows编辑器创建脚本文件,这意味着它使用Windows样式的CR-LF("\r\n")行结尾,而不是Unix样式的LF('\n')行结尾。 Cygwin下的一些程序可以处理任何一种形式,但shell不能处理。

例如,看起来像

的行
then

看起来像

这样的shell
then^M

其中^ M是ASCII CR字符。这实际上是一个有效的命令名称,如果它存在,但它没有,所以shell抱怨:

then^M: command not found

但是打印CR字符会导致光标返回到行的开头,因此在覆盖:之前翻转。

您收到“意外的文件结束”消息,因为shell从未看到fiif匹配。

您可以使用dos2unix命令修复行结尾。请务必阅读手册页(man dos2unix);与大多数文本过滤器不同,dos2unix替换其输入文件而不是写入stdout。

答案 1 :(得分:0)

我真的看不出你的代码有什么问题,除了那些不适合旧贝壳的合法地方。另请注意mv参数周围的引号(但如果文件名称正确,则不应该出现问题)。

试试这个:

#!/bin/sh    

oldFile="/Documents/sampleFolder/sampleFile.xml"
newFile="/Documents/sampleFile.xml"
backupFileName="/Documents/sampleFolder/sampleFile2.backup"
oldFileLocation="/Documents/sampleFolder"

if [ -f "$newFile" ]
then
    echo "File found"
    mv "$oldFile" "$backupFileName"
    mv "$newFile" "$oldFileLocation"
else
    echo "File not found, do nothing"
fi  

PS:验证/ bin / sh是否(或指向)基于bourne的shell。

答案 2 :(得分:0)

我在案件中做了什么: 我使用Bash On Ubuntu on WindowsWindows 10)代替Cygwin,然后使用dos2unix安装sudo apt-get install dos2unix并使用以下命令解决此问题:

$ dos2unix < compilelibs.sh > output.sh