मैं बैश स्क्रिप्ट में अन्य कमांड के मापदंडों को कैसे अग्रेषित करूं?


165

मेरी बैश स्क्रिप्ट के अंदर, मैं शून्य, एक या दो मापदंडों (स्क्रिप्ट उन्हें पहचान सकता हूं) को पार्स करना चाहता हूं, फिर स्क्रिप्ट में आमंत्रित कमांड के शेष मापदंडों को अग्रेषित करें। मैं उसे कैसे कर सकता हूँ?

जवाबों:


239

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


23
वास्तव में "$ @" $ * से अधिक सुरक्षित है
पिक्सेल

1
@ पिक्सलबीट: धन्यवाद, अच्छी पकड़। मैंने संपादित किया। @ Toukasz Lew: मैनुअल में लिंक्ड-इन पेज देखें। :) मूल रूप से, यह बेहतर उद्धृत करता है।
खोलना

22
$@सरणी के प्रत्येक तत्व को उद्धृत स्ट्रिंग के रूप में अनिवार्य रूप से मानते हैं - वे विस्तार के अवसर के बिना पारित किए जाते हैं। यह यह भी सुनिश्चित करता है कि प्रत्येक को एक अलग शब्द के रूप में देखा जाए। अंतर को प्रदर्शित करने वाली एक टेस्ट स्क्रिप्ट के साथ यह स्पष्टीकरण यहां है: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel

2
उद्धरणों का उपयोग करने पर ध्यान दें! इसके बारे में और अधिक पढ़ें कि यह उनके चारों ओर क्यों महत्वपूर्ण है: stackoverflow.com/a/4824637/4575793
Cadoiz

32

bash शिफ्ट कमांड का उपयोग करता है :

उदा। Shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3 पैदा करता है

1
2 3

2
@ TamásZahola देखभाल की व्याख्या करने के लिए?
काइल चड्ढा

2
यदि आप $1उन्हें उद्धृत किए बिना तर्कों को आगे बढ़ाते हैं "$1", तो शेल शब्द विभाजन का प्रदर्शन करेगा, इसलिए उदाहरण के लिए और अलग से foo barअग्रेषित किया जाएगा । foobar
तमसा ज़ाहोला

इसके बारे में और अधिक पढ़ें कि यहां डबल "क्यों होना महत्वपूर्ण है: stackoverflow.com/a/4824637/4575793
Cadoiz

1
मेरे मस्तिष्क ने "शिफ्टेस्ट" में कुछ अक्षरों को जोड़ दिया और मैंने इसे कुछ और के रूप में पढ़ा।
एलेक्स

21

बैश सब्सट्रेटिंग मापदंडों ( सब्सक्रिप्शन और सब्सक्रिप्शन देखें ) का समर्थन करता है , इसलिए आप चुन सकते हैं कि कौन से पैरामीटर को इस तरह से प्रोसेस / पास करना है।

  1. नई फ़ाइल खोलें और उसे संपादित करें: vim r.sh:

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
    
  2. चलाओ:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
    
  3. परिणाम है:

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.