2010-11-25 72 views
-1

我正在使用快速而髒的BASH腳本來自動執行CF分區過程。
這工作得很好,直到我想添加到它。Bash EOF有意外的行爲

基本上,我有一個腳本劃分出小型閃存這樣:

CMD=.fdisk 
DEV=/dev/sdc 

echo "Calculating partition sizes..." 
P1SIZE=+1100M 
P2SIZE=+1200M 

echo "Creating instruction file..." 
PT1="n p 1\n $P1SIZE" 
PT2="n p 2\n $P2SIZE" 
END="a 1 w EOF\n" 

[ -e $CMD ] && rm -rf $CMD 

for i in $PT1 $PT2 $END; do echo -e $i >> $CMD; done 

echo "Creating partitions..." 
fdisk $DEV << EOF < $CMD 
[ -e $CMD ] && rm -f $CMD 

的想法是,在未來的「$ CMD」表示的文件將自動與外部工具創建適當的開始和結束值。現在我只是接受默認的開始並提供一個大小。

這很有效,直到我想在腳本中加入一些額外的步驟。但是當我注意到奇怪的行爲時,我遇到了問題。

第一個是,如果我添加上面的代碼的函數裏面,我會不斷收到一個腳本錯誤:

line XX: syntax error: unexpected end of file 

另外,我意識到,「FDISK」命令後的任何額外的代碼將不會執行腳本似乎只是終止(沒有錯誤,$?= 0)。

有誰知道爲什麼該功能不起作用,腳本終止?

+0

驅動器downvoters是一個討厭的,但他們發生;最好習慣它。如果您認爲自己受到攻擊(大量降價),請與團隊聯繫或諮詢。他們可能是一個失敗者,他們可能會比你想要的更低落,但你最好忽略他們。 (悲傷,但如此) – 2010-11-26 05:31:41

回答

3

你已經開始了heredoc(<< EOF),但你永遠不會在任何地方結束它。

+0

我明白我現在做錯了什麼!雖然我的命令文件中有'EOF'限制字符串,但是bash想要在特定腳本中找到它,並且沒有其他地方。我寫了一個回答,描述如何使它在我的情況下工作。感謝您指出了這一點! – Jeach 2010-11-26 04:55:09

4

經驗法則是,您使用的'限制字符串'(在我的例子中,我使用的是'EOF',但您可以使用任何您想要的)在它前面不得有空格(或製表符)。如果是這樣,它不會被認爲是結束。

例子:

myFunction() { 
    cat << EOF 
     Hello 
     World 
     EOF 
} 

的「EOF」以上被認爲是普通的文本,因爲它在它前面的空格!如果你寫下面的代碼:

myFunction() { 
    cat << EOF 
     Hello 
     World 
EOF 
} 

它現在會工作!

如果您堅持使用空格,則可以通過在'< <'字符的右側使用' - '字符來禁止選項卡。

例子:

myFunction() { 
    cat <<- EOF 
     Hello 
     World 
     EOF 
} 

注意,這隻適用於選項卡,而不是空格!這對於保持代碼的可讀性更好。

另請注意,如果引用「限制字符串」,則最終會禁用參數替換。所以如果你想寫的文本不應該被替換或執行,這使得它成爲可能:

cat << "EOF" 
    Type `ls -la` at the command prompt 
EOF 
+0

哇,我以爲我瘋了,直到看到這篇文章。刪除前綴EOF的空格解決了我意外的文件錯誤結束。 – 2016-02-02 11:55:30