BASH意外的EOF

BASH意外的EOF,bash,eof,Bash,Eof,我的Mac一直在最后一行告诉我这个bash脚本的意外文件结尾。我对编程并不陌生,但对BASH非常陌生,有人认为这有什么不对吗 #!/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


我的Mac一直在最后一行告诉我这个bash脚本的意外文件结尾。我对编程并不陌生,但对BASH非常陌生,有人认为这有什么不对吗

#!/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

提前谢谢你

我在Mac电脑上处理了你的问题代码(复制粘贴),并用以下文件运行了该文件:

bash -n -v x.sh
事实上,我做了两次;第一次,我确保文件末尾有一个换行符,第二次我确保没有换行符。巴什两次都很开心

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

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

$ readlink -f $0
readlink: illegal option -- f
usage: readlink [-n] [file ...]
$
Linux版本的
readlink
采用
-f
。它不是POSIX命令,因此没有法律标准可供参考。


使用od-c分析文件时发现行结尾是\r\n,我确实在Windows中修改了文件,真傻。无论如何,我对BASH脚本还有另一个问题。这一行:

while sleep 1; do kill -0 $PIDD || break; done
应等待PID(存储在变量$PIDD中)关闭。它等待直到它不存在(PID),但当它最终不存在时,它输出:kill:4:没有这样的进程。脚本的其余部分按预期工作,但脚本不会终止。我可以使脚本正确终止,而不输出这样的进程吗?
对于所有的新手问题,我很抱歉,我对BASH和Linux很糟糕。

再次感谢您的帮助。

您是否尝试在最后一行
rm
之后添加换行符?您在命令行上将哪些参数传递给此脚本?这就是$n术语所指的,我想可能是缺少或格式不正确的$4术语会导致问题。这也是我唯一的建议。某些编辑器不会自动执行此操作,因此请确保底部有一个空行。文件是否来自Windows/DOS系统?如果是这样的话,在行尾可能会有回车符(以及linefeeds unix系统,如OS X expect)。具体来说,
结尾处的CR,而。。。done
行可能会阻止bash识别
done
,因此它会一直寻找循环的结尾,直到它运行到文件的结尾…@Gordon:我可以确认,如果文件有DOS行结尾,然后你确实会得到“意外EOF”错误。你应该更新你原来的问题,而不是在你的答案上问另一个问题。尝试点击“编辑”链接并在那里更新您的问题。