2

我编写了一个简单的 shell 脚本来检查 xml 文件是否存在,如果存在,则将旧 xml 文件重命名为备份,然后将新 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 found: 
: command not found1: 
: command not found6: 
replaceXML.sh: line 26: syntax error: unexpected end of file
4

3 回答 3

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

看起来像贝壳

then^M

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

then^M: command not found

但是打印 CR 字符会导致光标回到行首,因此之前的所有:内容都会被覆盖。

您收到“文件意外结束”消息,因为 shell 从未见过fiif.

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

于 2012-10-05T21:35:19.630 回答
0

我真的看不出你的代码有什么问题,除了旧的 shell 不在合法的地方。还要注意 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。

于 2012-10-05T21:27:28.350 回答
0

我在我的情况下做了什么:我使用Bash On Ubuntu on Windows(in Windows 10) 而不是Cygwin然后安装dos2unix使用sudo apt-get install dos2unix并使用以下命令来解决此问题:

$ dos2unix < compilelibs.sh > output.sh
于 2017-03-28T03:02:52.690 回答