मुझे नहीं लगता कि किसी ने भी इस सवाल का जवाब दिया। उन्होंने यह नहीं पूछा कि क्या वह आदेश में तार गूँज सकते हैं। बल्कि सवाल के लेखक जानना चाहते हैं कि क्या वह फ़ंक्शन पॉइंटर व्यवहार का अनुकरण कर सकता है।
ऐसे कुछ उत्तर हैं जो मुझे पसंद हैं, और मैं इसे एक और उदाहरण के साथ विस्तारित करना चाहता हूं।
लेखक से:
function x() {
echo "Hello world"
}
function around() {
echo "before"
($1) <------ Only change
echo "after"
}
around 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" पास कर रहा है, आखिरकार echos के बाद। ।
एक और के रूप में, यह फ़ंक्शन नाम के रूप में चर का उपयोग करने की पद्धति है। चर वास्तव में स्ट्रिंग को पकड़ते हैं जो फ़ंक्शन का नाम है और ($ चर arg1 arg2 ...) फ़ंक्शन को तर्कों को पारित करने के लिए कहता है। निचे देखो:
function x(){
echo $3 $1 $2 <== just rearrange the order of passed params
}
Z="x"
($Z 10 20 30)
देता है: ३० १० २०, जहाँ हमने "एक्स" नाम के फंक्शन को वेरिएबल जेड में स्टोर किया और १० २० और ३० के मापदंडों को पार किया।
ऊपर जहां हम फ़ंक्शन को वेरिएबल नाम असाइन करके फ़ंक्शन को संदर्भित करते हैं, इसलिए हम फ़ंक्शन नाम को जानने के स्थान पर वेरिएबल का उपयोग कर सकते हैं (जो कि प्रोग्राम के सामान्य प्रवाह के लिए c में बहुत क्लासिक फ़ंक्शन पॉइंटर स्थिति में आप क्या कर सकते हैं, लेकिन पूर्व के समान है -फ़ंक्शन कॉल का चयन करना जो आप कमांड लाइन तर्कों के आधार पर बना रहे हैं)।
बैश में ये फंक्शन पॉइंटर्स नहीं होते हैं, बल्कि वे वेरिएबल्स होते हैं जो उन फ़ंक्शन के नामों को संदर्भित करते हैं जिन्हें आप बाद में उपयोग करते हैं।