2011-03-20 64 views
1


我的Mac一直在最后一行告诉我这个bash脚本文件的意外结束。我对编程并不陌生,但对BASH来说很新,有人看到有什么不对吗?BASH意外的EOF

#!/bin/bash 
#bootstrapper.sh 
PIDD="$5" 
while sleep 1; do kill -0 $PIDD || break; done 
# Absolute path to this script. /home/user/bin/foo.sh 
SCRIPT=$(readlink -f $0) 
# Absolute path this script is in. /home/user/bin 
SCRIPTPATH=`dirname $SCRIPT` 
POSPAR1="$1" #-l 
POSPAR2="$2" #location 
POSPAR3="$3" #-d 
POSPAR4="$4" #directory 
cp -r -f $SCRIPTPATH/$4/* $2 
rm -r -f $SCRIPTPATH/$4 

预先感谢您!

+1

您是否尝试在最后一个“rm”行之后添加换行符? – 2011-03-20 03:28:45

+0

您将命令行传递给此脚本的参数是什么?这就是$ n术语所引用的内容,我想可以想象,缺少或格式错误的$ 4术语会导致问题。 – hardmath 2011-03-20 03:30:53

+0

这也是我唯一的建议。有些编辑不会自动完成,因此请确保底部有空行。 – easel 2011-03-20 03:31:29

回答

2

我从应付在Mac(copy'n'paste)的问题,你的代码并运行与文件:

bash -n -v x.sh 

其实,我做了两次;第一次,我确保文件末尾有一个换行符,并且第二次确保没有换行符。 bash两次都很开心。

这表明问题不在可见字符中;文件中有一些看不见的字符会导致悲伤。您可能需要使用诸如od -c之类的工具仔细检查该文件,以查找造成问题的字符。

此外,FWIW,我的Mac上的readlink命令给出:

$ readlink -f $0 
readlink: illegal option -- f 
usage: readlink [-n] [file ...] 
$ 

Linux版本的readlink需要-f。它不是一个POSIX命令,所以没有标准标准来引用。

+0

文件来自Windows/DOS系统吗?如果是这样,那么在行结尾可能会出现回车(以及像OS X期望的换行系统)。具体来说,'while ... done'行末尾的CR可以防止bash识别'done',所以它一直在查找循环的结尾,直到它运行到文件末尾... – 2011-03-20 05:06:35

+0

@戈登:我可以证实,如果文件有DOS行结尾,那么你确实会得到'意外的EOF'错误。 – 2011-03-20 05:15:14

0


使用od -c分析文件显示结束行是\ r \ n,我修改了一个Windows文件,很傻。无论如何,我在BASH脚本中遇到了另一个问题。此行:

while sleep 1; do kill -0 $PIDD || break; done 

应该等到PID(存储在变量$ PIDD中)关闭。它等到它不存在(PID),但是当它最终不存在时,它输出:kill:4:没有这样的过程。脚本的其余部分按预期工作,但脚本不会终止。我可以使脚本正确终止,而不是没有这样的过程输出?
对不起所有的新手问题,我在BASH和Linux上很糟糕。
再次感谢您的帮助。

+0

你应该更新你原来的问题,而不是问你的答案另一个问题。尝试点击“编辑”链接并在那里更新您的问题。 – Lamak 2011-03-21 16:15:39