我不認爲有人會回答這個問題。他沒有問他是否可以按順序迴音。問題的作者想知道他是否可以模擬函數指針行爲。
有幾個答案很像我會做的,我想用另一個例子來擴展它。
從筆者:
function x() {
echo "Hello world"
}
function around() {
echo "before"
($1) <------ Only change
echo "after"
}
around x
爲了擴大這一點,我們將有函數x回聲「世界,你好:$ 1」,顯示當函數執行真正發生。我們將通過一個字符串,它的功能是「X」的名稱:)傳遞給函數左右(其中回聲報「之前」
function x() {
echo "Hello world:$1"
}
function around() {
echo "before"
($1 HERE) <------ Only change
echo "after"
}
around x
爲了說明這一點,字符串「X」,調用函數x (通過變量$ 1,第一個傳遞給參數的參數)傳遞參數「HERE」,最後回聲。
另一方面,這是使用變量作爲函數名稱的方法。變量實際上包含作爲函數名稱的字符串,並且($ variable arg1 arg2 ...)調用傳遞參數的函數。見下文:
function x(){
echo $3 $1 $2 <== just rearrange the order of passed params
}
Z="x" # or just Z=x
($Z 10 20 30)
給出:30 10 20,在那裏我們執行命名的函數「X」存儲在變量Z和通過分配的變量名傳遞的參數10 20和30
以上在這裏我們參考函數所以我們可以使用變量來代替實際知道函數名稱的地方(這類似於你在c中的一個非常經典的函數指針情況下可以做的事情,用於推廣程序流但是預先選擇你將要進行的函數調用基於命令行參數)。
在bash中,這些不是函數指針,而是指向稍後使用的函數名稱的變量。
eval是唯一的方法。 – Wes 2011-04-15 04:18:05
你可以很容易地檢查'eval $ 1'是否會使用'if declare -F「$ 1」>/dev/null來調用一個函數;然後評估$ 1; fi' – user123444555621 2011-04-15 04:26:14
...或甚至更好:'eval $(declare -F「$ 1」)' – user123444555621 2011-04-15 04:58:03