2011-08-29 71 views
4

W /母雞我運行下面的代碼片段在bash腳本意外「語法錯誤:意外的文件結尾」關於if語句

#!/bin/bash 
if [ "foo" = "foo" ]; 
then 
echo "true" 
else 
echo "false" 
fi 
echo "end" 

我得到

sfm_write_buffer_test.sh: line 9: syntax error: unexpected end of file 

此不作任何感。 echo語句工作正常,但是當遇到if語句時,它會提供上述錯誤。

+4

嘗試的if語句 –

+1

我只是複製並粘貼上述去除尾隨分號到一個腳本我的系統上並運行它。輸出是兩行:'true'和'end'。與bash版本2.01.1,3.2.25和4.2.8的結果相同。 –

+0

這是我們最常見的常見問題之一。驚訝的是,它花了這麼長時間來完成一個重複。 –

回答

8

你在Cygwin上吧?

正如我在評論說,當我複製並粘貼您的腳本,我的系統上運行它,它的工作原理;輸出

true 
end 

但是,當我改變行結束從Unix樣式'\n'到Windows風格'\r\n',我讓你得到了同樣的錯誤。

隨着Windows風格的行尾時,bash不會看到then關鍵字;它會看到名爲then\r的命令。它從不試圖,因爲它是掃描匹配thenfi用於if關鍵字(其中確認,因爲它不是在該行的末尾)來執行它。

確保你的shell腳本使用Unix風格的行結束符。

3

問題是腳本末尾的CRLF。當Shell腳本看到Windows風格的行尾時會拋出此錯誤。您需要用Unix風格的LF替換shell腳本中的行結尾。每個IDE都有自己的做法。

Sublime Text 2 ==> View -> Line Endings -> Unix

Notepad++ ==> Edit -> EOL Conversion -> UNIX/OSX Format

一旦你做了這個改變並保存文件,shell腳本應該執行沒有錯誤。

0

這不是你的具體問題,但是這也有可能發生,如果您粘貼一個縮進定界符您的if語句裏,它已經從標籤到空間轉換。由於空白,絕不會找到heredoc的結束分隔符,並且會導致意外的文件結束。