(Bash) स्क्रिप्ट के बीच रिक्त स्थान के साथ तर्क पास करना


92

मुझे निम्नलिखित बैश दो स्क्रिप्ट मिली हैं

a.sh:

#!/bin/bash
./b.sh 'My Argument'

b.sh:

#!/bin/bash
someApp $*

1 के बजाय someApp बाइनरी को $*2 तर्क ('मेरा' और 'तर्क') के रूप में प्राप्त होता है ।

मैंने कई चीजों का परीक्षण किया है:

  • केवल कुछ चलाकर b.shअपेक्षित रूप से काम करता है
  • Iterate + b.shअपेक्षा के अनुसार कार्यों में तर्कों को प्रतिध्वनित करता है
  • के $@बजाय का उपयोग करने से $*कोई फर्क नहीं पड़ता

6
कोशिश करो someApp "$*"याsomeApp "$@"
रसेल उहल

1
यप्प - एक आकर्षण की तरह काम करता है!
जॉन फियर

जवाबों:


146

$*, निर्विवाद, दो शब्दों तक फैलता है। आपको इसे उद्धृत करने की आवश्यकता है ताकि someAppएकल तर्क प्राप्त हो।

someApp "$*"

ऐसा नहीं है कि आप उपयोग करना चाहते हो सकता है $@के बजाय, ताकि someAppदो तर्क प्राप्त होगा यदि आप कॉल करने के लिए थे b.shके रूप में

b.sh 'My first' 'My second'

के साथ someApp "$*", someAppएक ही तर्क प्राप्त होगा My first My second। के साथ someApp "$@", someAppदो तर्क प्राप्त होंगे, My firstऔर My second


24
यह याद रखना आसान है कि "$ @" को उद्धृत करने की आवश्यकता है, ऐसा लगता है। $ @ पर्याप्त नहीं है।
चमत्कार 2

1
@ चमत्कार 2k सही। अयोग्य, $@और पहचान से $*काम करना।
शेपनर

2
@ मैट जो कुछ पूरी तरह से अलग है। "$ @" इस मायने में खास है कि यह प्रत्येक तर्क को अलग-अलग उद्धृत करता है। इस प्रकार एक से अधिक तर्क हो सकते हैं। "$ कुछ" बस कुछ भी जो कुछ भी करने के लिए फैलता है चारों ओर उद्धरण है और हमेशा एक ही तर्क होगा।
कार्लो वुड

यदि मैं सेट करता हूं तो उत्तर केवल मेरे लिए काम करता है IFS=$'\n'। पता नहीं क्यों।
डोमिनिक एम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.