2011-03-20 74 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