Bash

是否可以在函式中添加函式?

  • January 19, 2021

這是我的程式碼:

function update_profile
{
   echo "1. Update Name"
   echo "2. Update Age"
   echo "3. Update Gender"
   echo "Enter option: "
   read option

   case $option in
        1) update_name ;;
        2) update_age ;;
        3) update_gender ;;
   esac

   function update_name
   {
       echo "Enter new name: "
       read name
   }
}

只是想確定是否可以這樣做。我知道我可以把所有的程式碼都扔進箱子裡,但它會很亂,所以我想在一個函式內創建一個獨立的函式,並在需要時呼叫它來執行它的命令。

是的,這是可能的。

甚至可以將一個函式嵌套在另一個函式中,儘管這不是很有用。

f1 ()
{

 f2 () # nested
 {
   echo "Function \"f2\", inside \"f1\"."
 }

}  

f2  #  Gives an error message.
   #  Even a preceding "declare -f f2" wouldn't help.

echo    

f1  #  Does nothing, since calling "f1" does not automatically call "f2".
f2  #  Now, it's all right to call "f2",
   #+ since its definition has been made visible by calling "f1".

   # Thanks, S.C.

資料來源:Linux 文件項目

您可以在 shell 需要命令的任何地方定義函式,包括在函式中。請注意,該函式是在 shell 執行其定義時定義的,而不是在 shell 解析文件時定義的。因此,如果使用者在第一次執行時選擇選項 1,您的程式碼將不起作用update_profile,因為update_name在語句中呼叫時case,函式的定義update_name尚未執行。一旦函式update_profile被執行一次,函式update_name也將被定義。

您需要update_name在使用它的點之前移動定義。

定義update_name內部update_profile並不是特別有用。這確實意味著update_name在第一次執行之前不會定義update_profile它,但之後它將保持可用。如果您只想update_name在內部可用update_profile,請在其中定義函式並unset -f update_name在從函式返回之前呼叫。但是,與做簡單的事情並在全域範圍內定義所有函式相比,這樣做並不會真正獲得任何好處。

引用自:https://unix.stackexchange.com/questions/179580