2010-12-03 92 views
1

我一直在處理我們的介紹腳本任務,並且在腳本中調用函數時遇到問題。我處於作業的第二部分,我只是在測試以確定我擁有的是(希望)能夠工作。我收集了一些目錄,並詢問是或否的問題。當我得到'y'時,我寫了一個我稱之爲的小函數,當我得到'n'時,我有另一個函數,兩個簡單的回聲。什麼是問題?在bash腳本中調用函數時出現問題

part_two(){ 
    answer="" 
    for value in "[email protected]";do 
     echo "$value" 
     while [ "$answer" != "y" -a "$answer" != "n" ] 
     do 
     echo -n "Would you like to save the results to a file? (y/n): " 
     read answer 
     done 
     if [ "$answer" = "n" ] 
     then 
      part_six 
     elif [ "$answer" = "y" ] 
     then 
      part_five 
     fi 
    done 
} 

part_two [email protected] 

part_five(){ 
    echo -n "working yes"; 
} 

part_six(){ 
    echo -n "working no"; 
} 

任何幫助將不勝感激,一如既往。

+1

直到您告訴我們您遇到的不需要的行爲,我們才能告訴您問題 – SiegeX 2010-12-03 07:53:13

回答

9

就像在C中一樣,函數在使用之前必須定義。在聲明這兩個函數之前,在您的代碼片段中調用part_two(它調用part_five和part_six)。

您是否嘗試將其定義移至腳本的開頭?

編輯:

在大多數情況下,對付這猛砸最好的辦法是在執行任何實際的命令之前,簡單地定義在腳本開始的所有功能。定義的順序並不重要 - shell只是在它將要使用它時查找函數 - 所以通常不存在依賴性問題等,您可能需要考慮。

編輯2:

箱子,你可能無法在腳本的開始,只是定義一個函數。一種常見的情況是,當你使用條件結構來動態地選擇或修改功能e..g:聲明

if [[ "$1" = 0 ]]; then 
    function show() { 
     echo Zero 
    } 
else 
    function show() { 
     echo Not-zero 
    } 
fi 

在這種情況下必須確保每個函數調用該函數後會發生(以及任何其他人所稱的)被宣佈。

編輯3:

在bash函數聲明實際上是function foo() { ... }塊,你定義它的實現 - 是的,在function關鍵字是不是絕對必要的。在C中沒有函數原型 - 它們無論如何都沒有意義,因爲shell腳本在執行時通常會被解析。較新的Bash版本可以一次讀取腳本,但它們主要檢查語法錯誤,而不是像這樣的邏輯錯誤。

順便提一下,官方稱謂是「功能聲明」,但即使是Bash信息頁面也可以互換使用「聲明」和「定義」。

+0

謝謝。我們談到了課堂上的功能,但只是暫時的,並沒有意識到他們需要定義。 – mrwienerdog 2010-12-03 07:59:59