पास के रूप में कार्य करने के लिए तर्क पास करें


10

मेरा निम्नलिखित कार्य है:

bar() { echo $1:$2; }

मैं इस समारोह बोल रहा हूँ एक और , समारोह foofooखुद को इस प्रकार कहा जाता है:

foo "This is" a test

मैं निम्नलिखित आउटपुट प्राप्त करना चाहता हूं:

This is:a

यही है, जो तर्क barप्राप्त करता है, वही टोकन होना चाहिए जो मैं पास करता हूं foo

fooइसे प्राप्त करने के लिए इसे कैसे लागू किया जाना चाहिए? मैंने निम्नलिखित दो कार्यान्वयन की कोशिश की है, लेकिन न तो काम करता है:

  • foo() { bar $*; }

    - आउटपुट: this:is

  • foo() { bar "$*"; }

    - आउटपुट: this is a test:

मेरा प्रश्न प्रभावी रूप से है कि मैं तर्कों के उद्धरण को कैसे संरक्षित कर सकता हूं। क्या यह वास्तव में संभव है?


जवाबों:


14

उपयोग करें "$@":

$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a

"$@"और "$*"विशेष अर्थ हैं:

  • "$@"शब्दों (जैसे "$1" "$2" ...) के लिए विस्तार किए बिना कई शब्दों का विस्तार ।
  • "$*" IFS में पहले चरित्र के साथ स्थितीय मापदंडों को जोड़ता है (या यदि IFS खाली है या IFS खाली है तो कुछ भी नहीं)।

धन्यवाद, मुझे पता नहीं था कि $*यह शब्दार्थ था - अब यह तर्कसंगत है। मुझे लगता है कि यह उत्तर वास्तव में एक और समस्या का हल करता है, जब मैं सरणियों पर पुनरावृत्ति कर रहा हूं ...
कोनराड रूडोल्फ

6

आपको $@इसके बजाय, का उपयोग करना चाहिए$*

bar() { echo "$1:$2"; }

foo() { bar "$@"; }

foo "This is" a test

ouput

This is:a

यह काम क्यों करता है?

क्योंकि साथ $*सभी पैरामीटर, एक के रूप में देखा जाता है एक शब्द , इसका मतलब यह है कि आप पारित करेंगे This is a testकरने के लिए barकार्य करते हैं। इस स्थिति में, कार्य पट्टी के लिए 1 पैरामीटर पास है This, 2 है is

साथ $@, प्रत्येक पैरामीटर एक है उद्धृत स्ट्रिंग , इसका मतलब यह है कि आप पारित करेंगे 'This is' 'a' 'test'करने के लिए barfuntion। तो फंक्शन बार में 1st पैरामीटर पास है This is, 2nd है a

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.