बश में कमांड लाइन तर्क कैसे बदलें?


92

क्या बाश स्क्रिप्ट में कमांड लाइन के तर्कों को बदलने का एक तरीका है। उदाहरण के लिए कहें, एक बैश स्क्रिप्ट निम्न तरीके से लागू होती है:

./foo arg1 arg2  

क्या स्क्रिप्ट के भीतर arg1 के मूल्य को बदलने का कोई तरीका है? कहो, कुछ ऐसा है

$1="chintz"

जवाबों:


147

आपको सभी तर्कों को रीसेट करना होगा। उदाहरण के लिए $3:

$ set -- "${@:1:2}" "new" "${@:4}"

मूल रूप से आप अपने वर्तमान मूल्यों के लिए सभी तर्क निर्धारित करते हैं, केवल उस एक को छोड़कर जिसे आप बदलना चाहते हैं। POSIX 7 द्वारा भी निर्दिष्ट हैset --

"${@:1:2}"अंकन दो के लिए विस्तार किया गया है (इसलिए 2अंकन में) ऑफसेट स्थितीय से शुरू तर्क 1(यानी $1)। यह "$1" "$2"इस मामले के लिए एक आशुलिपि है , लेकिन जब आप प्रतिस्थापित करना चाहते हैं तो यह बहुत अधिक उपयोगी है "${17}"


1
इसलिए, $ 3 को बदलने के लिए, मुझे $ 1 और $ 2 को भी बदलना होगा, है ना? और उन्हें बदलकर क्या? "रीसेट" का क्या अर्थ है?
श्रीराम

चाल के लिए धन्यवाद! मुझे एम्बेडेड स्पेस वाले फ़ाइलनाम के लिए इसका उपयोग करने में कठिनाई हुई। किसी और के लिए जो उस समस्या में भाग सकता है, evalप्रति पंक्ति के सामने इस पर डालने का प्रयास करें
cxw

2
यह ठीक है जब आप उस पैरामीटर की स्थिति जानते हैं जिसे आप बदलना चाहते हैं। क्या होगा यदि आप वास्तव में इसे नहीं जानते हैं और इसे गतिशील रूप से बदलने की आवश्यकता है? मैंने $ सेट के साथ कोशिश की - "$ {: 1: $ धुरी}", लेकिन यह वहाँ एक चर को स्वीकार नहीं करता है।
डेनियल सेगाटो

1
मैं एक फ़ंक्शन के अंदर से एक ही काम कैसे कर सकता हूं? किसी फ़ंक्शन के अंदर से आह्वान करने पर आपका समाधान काम नहीं करता है।
हशकेन

2
आप किसी फ़ंक्शन के भीतर स्क्रिप्ट की स्थिति के मापदंडों को नहीं बदल सकते हैं - फ़ंक्शन के स्वयं के तर्क उन्हें छिपाते हैं। हालाँकि, आप उन्हें एक सरणी में संग्रहीत कर सकते हैं और उस पर काम कर सकते हैं।
थकाला

22

उपयुक्तता और स्थिरता के लिए ऑप्टिमाइज़ करना, आप असाइन करना $1और $2अधिक सार्थक चर (मुझे नहीं पता, input_filename = $1और output_filename = $2या कुछ) से बेहतर हो सकते हैं और फिर उन चर में से एक को ओवरराइट कर सकते हैं ( input_filename = 'chintz'), इनपुट को स्क्रिप्ट में अपरिवर्तित छोड़कर कहीं और चाहिए।


मुझे एक दृष्टिकोण चाहिए था जहाँ मैं इनपुट तर्कों में से किसी एक को बदल सकता था। मुझे ऐसा करने की ज़रूरत थी क्योंकि मैं स्क्रिप्ट से एक मूल्य वापस करना चाहता था। ठक्ला द्वारा सुझाए गए जवाब ने अच्छा काम किया। जवाब देने के लिए धन्यवाद!!!
श्रीराम

3
@ जोंसविएब सहमत। पठनीयता के लिए, आपकी बेहतर विधि है।
Dss

1
"आप बेहतर बंद हैं" हमेशा उपयोग के मामले पर निर्भर करता है, जो प्रदान नहीं किया जाता है।
स्कॉट

2
@ 7 साल से अधिक उम्र का और उससे अधिक अनुभव जब मैंने यह उत्तर लिखा था, तो मैं आपसे सहमत होना चाह रहा हूं।
जॉन्सवेब

उदाहरण जहां यह काम नहीं करेगा ($ FIRST_PARAMETER जैसी चीज़ का उपयोग करने के अलावा): वास्तविक मूल्य के आधार पर पैरामीटर का उपयोग और अर्थ।
इगोर स्टोपा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.