我编写了一个简单的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
答案 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
看起来像
这样的shellthen^M
其中^ M是ASCII CR字符。这实际上是一个有效的命令名称,如果它存在,但它没有,所以shell抱怨:
then^M: command not found
但是打印CR字符会导致光标返回到行的开头,因此在覆盖:
之前翻转。
您收到“意外的文件结束”消息,因为shell从未看到fi
与if
匹配。
您可以使用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 Windows
(Windows 10
)代替Cygwin
,然后使用dos2unix
安装sudo apt-get install dos2unix
并使用以下命令解决此问题:
$ dos2unix < compilelibs.sh > output.sh