(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.