शेल स्क्रिप्ट के अंदर एक प्रोग्राम के लिए कमांड लाइन पैरामीटर पास करें


16

के रूप में ./script.sh arg1 [arg2 arg3 ...], कमांड लाइन तर्क arg1, arg2... $1, द्वारा प्राप्त किया जा सकता है $2, ... लेकिन तर्कों की संख्या तय नहीं है।

शेल स्क्रिप्ट में, मैं arg2एक कार्यक्रम से शुरू होने वाले तर्कों को पारित करना चाहता हूं ,

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

मैं इसे कैसे कर सकता हूं क्योंकि एक या अधिक तर्क हो सकते हैं?

जवाबों:


18

सामान्य तरीका यह होगा कि आप arg1 ( "$1") की एक प्रति को सहेज लें और मापदंडों को एक में बदल दें, ताकि आप पूरी सूची का उल्लेख कर सकें "$@":

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

बैश में बेशक कुछ ऐरे सपोर्ट है, लेकिन सवाल के लिए पोज़ देने की ज़रूरत नहीं है।

अगर arg1 वैकल्पिक है, तो आप इसके लिए इस तरह से जाँच करेंगे:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

क्या उपयोग करते समय दोहरा उद्धरण आवश्यक है $@?
ली

1
डबल-कोट्स $@प्रत्येक पैरामीटर को शेल को डबल-कोट करने के लिए कहता है (यदि पैरामीटर में कोष्ठक या तारांकन जैसे दिलचस्प अक्षर हों तो कुछ अच्छा होगा)। यदि आप इस बारे में परवाह नहीं करते हैं, तो एक सादा $*काम करता है ...
थॉमस डिकी

6
@ हाँ, दोहरे उद्धरण आवश्यक हैं। अन्यथा, तर्कों की सूची से गुजरने के बजाय, प्रत्येक तर्क को व्हॉट्सएप पर विभाजित किया जाता है, फिर प्रत्येक टुकड़े को वाइल्डकार्ड पैटर्न के रूप में व्याख्या की जाती है और, यदि पैटर्न मेल खाता है, तो इसे मैचों की सूची से बदल दिया जाता है। आम तौर पर, बोलना, हमेशा डबल उद्धरण चर प्रतिस्थापन
गिल्स एसओ- बुराई को रोकना '

10

आप पैरामीटर विस्तार का उपयोग करके स्थितीय मापदंडों को स्लाइस कर सकते हैं। वाक्य रचना है:

${parameter:offset:length}

यदि lengthछोड़ दिया जाता है तो इसे अंतिम मान तक लिया जाता है।

जैसा कि आप दूसरे से अंतिम तर्कों तक पहुंचने के लिए थे, आपको इसकी आवश्यकता है:

${@:2}

उदाहरण:

$ foo() { echo "${@:2}" ;}

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