मेरी बैश स्क्रिप्ट के अंदर, मैं शून्य, एक या दो मापदंडों (स्क्रिप्ट उन्हें पहचान सकता हूं) को पार्स करना चाहता हूं, फिर स्क्रिप्ट में आमंत्रित कमांड के शेष मापदंडों को अग्रेषित करें। मैं उसे कैसे कर सकता हूँ?
मेरी बैश स्क्रिप्ट के अंदर, मैं शून्य, एक या दो मापदंडों (स्क्रिप्ट उन्हें पहचान सकता हूं) को पार्स करना चाहता हूं, फिर स्क्रिप्ट में आमंत्रित कमांड के शेष मापदंडों को अग्रेषित करें। मैं उसे कैसे कर सकता हूँ?
जवाबों:
shift
तर्कों को "खाने" के लिए अंतर्निहित कमांड का उपयोग करें । फिर बच्चे की प्रक्रिया को बुलाओ और इसे "$@"
शेष सभी तर्कों को शामिल करने के लिए तर्क दें। उद्धरणों पर ध्यान दें, उन्हें रखा जाना चाहिए, क्योंकि वे तर्क सूची के विस्तार को ठीक से उद्धृत करने का कारण बनते हैं।
$@
सरणी के प्रत्येक तत्व को उद्धृत स्ट्रिंग के रूप में अनिवार्य रूप से मानते हैं - वे विस्तार के अवसर के बिना पारित किए जाते हैं। यह यह भी सुनिश्चित करता है कि प्रत्येक को एक अलग शब्द के रूप में देखा जाए। अंतर को प्रदर्शित करने वाली एक टेस्ट स्क्रिप्ट के साथ यह स्पष्टीकरण यहां है: tldp.org/LDP/abs/html/internalvariables.html#APPREF
bash शिफ्ट कमांड का उपयोग करता है :
उदा। Shifttest.sh:
#!/bin/bash
echo $1
shift
echo $1 $2
shifttest.sh 1 2 3 पैदा करता है
1
2 3
$1
उन्हें उद्धृत किए बिना तर्कों को आगे बढ़ाते हैं "$1"
, तो शेल शब्द विभाजन का प्रदर्शन करेगा, इसलिए उदाहरण के लिए और अलग से foo bar
अग्रेषित किया जाएगा । foo
bar
बैश सब्सट्रेटिंग मापदंडों ( सब्सक्रिप्शन और सब्सक्रिप्शन देखें ) का समर्थन करता है , इसलिए आप चुन सकते हैं कि कौन से पैरामीटर को इस तरह से प्रोसेस / पास करना है।
नई फ़ाइल खोलें और उसे संपादित करें: 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}"
चलाओ:
$ chmod u+x r.sh
$ ./r.sh 1 2 3 4 5 6 7 8 9 10
परिणाम है:
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