स्थानीय कीवर्ड का उपयोग करके बैश में परिवर्तनशील परिभाषा


33

मैं बैश स्क्रिप्टिंग सीख रहा हूं और यह मेरे / usr / शेयर / बैश-समापन, लाइन 305 पर पाया गया:

local cword words=()

यह क्या करता है? ऑनलाइन सभी ट्यूटोरियल सिर्फ प्रारूप में हैं

local var=value

जवाबों:


92

हालांकि मुझे जोर्डनम द्वारा दिए गए उत्तर पसंद हैं, मुझे लगता है कि कम अनुभवी Linuxउपयोगकर्ताओं को दिखाना उतना ही महत्वपूर्ण है कि इस तरह के सवालों का सामना कैसे करें।

सुझाया गया तरीका Google खोज परिणाम पृष्ठ पर दिखाई देने वाले यादृच्छिक पृष्ठों के उत्तर खोजने की तुलना में तेज़ और अधिक बहुमुखी है।

सबसे पहले, सभी आज्ञाएँ जो Bashबिना किसी स्पष्ट पथ को टाइप किए बिना चलाई जा सकती हैं जैसे कि ./commandदो श्रेणियों में विभाजित की जा सकती हैं: Bash shell builtinsऔर external commandsBash shell builtinsके साथ स्थापित आओ Bashऔर इसका हिस्सा हैं, जबकि external commandsका हिस्सा नहीं हैं Bash। यह महत्वपूर्ण है क्योंकि Bash shell builtinsअंदर दस्तावेज हैं man bashऔर उनके प्रलेखन को भी लागू किया जा सकता हैhelp कमांड के जबकि external commandsआमतौर पर अपने स्वयं के दस्तावेज होते हैं manpagesया -h, --helpध्वज के कुछ राजा लेते हैं । यह जाँचने के लिए कि क्या कोई कमांड है Bash shell builtinया external command:

$ type local
local is a shell builtin

यह प्रदर्शित करेगा how command would be interpreted if used as a command name (से help type) । यहाँ हम देख सकते हैं कि localshell builtin। आइए एक और उदाहरण देखें:

$ type vim
vim is /usr/bin/vim

यहाँ हम देख सकते हैं कि vimयह shell builtinएक बाहरी आदेश नहीं है/usr/bin/vim । लेकिन, कभी कभी एक ही आदेश एक के रूप में दोनों स्थापित किया जा सकता external commandहै और एक होना shell builtinएक ही समय में। उदाहरण के लिए, सभी संभावनाओं को सूचीबद्ध -aकरने के typeलिए जोड़ें :

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

यहाँ हम देख सकते हैं कि echoदोनों एक shell builtinऔर एक है external command। हालाँकि, अगर आपने सिर्फ टाइप किया echoऔर दबायाReturn एक shell builtinयह इस सूची में पहले प्रकट होता है क्योंकि कहा जाता। ध्यान दें कि इन सभी संस्करणों echoको समान होने की आवश्यकता नहीं है। उदाहरण के लिए, मेरे सिस्टम /usr/bin/echoपर --helpझंडा builtinनहीं है, जबकि ऐसा नहीं है।

ठीक है, अब जब हम जानते हैं कि localशेल शेल है तो आइए जानें कि यह कैसे काम करता है:

$ help local
local: local [option] name[=value] ...
Define local variables.

Create a local variable called NAME, and give it VALUE.  OPTION can
be any option accepted by `declare'.

Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.

Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.

पहली पंक्ति पर ध्यान दें name[=value]:। के बीच सब कुछ [और ]है वैकल्पिक । यह एक सामान्य सम्मेलन है जिसका उपयोग कई manpagesऔर प्रलेखन के रूप में किया जाता है*nix दुनिया है। कहा जा रहा है, आपके द्वारा अपने प्रश्न के बारे में पूछा गया आदेश पूरी तरह से कानूनी है। बदले में, ...चरित्र का मतलब है कि पिछले तर्क को दोहराया जा सकता है। आप इस सम्मेलन के बारे में कुछ संस्करणों में भी पढ़ सकते हैं man man:

The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.

bold text          type exactly as shown.
italic text        replace with appropriate argument.
[-abc]             any or all arguments within [ ] are optional.
-a|-b              options delimited by | cannot be used together.
argument ...       argument is repeatable.
[expression] ...   entire expression within [ ] is repeatable.

इसलिए, दिन के अंत में, मुझे आशा है कि अब आपको यह समझने में आसानी होगी कि अलग-अलग कमांड कैसे हैं Linux काम हैं।


5
बहुत अच्छा जवाब। मैं इसके माध्यम से यह पढ़ रहा था कि आपको यह पता चलेगा कि एक शुरुआतकर्ता कैसे खुद को खोज सकता है कि सरणी असाइनमेंट कोड से क्या था var=(), लेकिन मुझे लगता है कि जो आप खोज रहे हैं उसका नाम जाने बिना भी यह पता लगाना थोड़ा अधिक है। । ;)
वाइल्डकार्ड

क्या गैर-बैश गोले भी समर्थन localकरते हैं?
पाल्सिम

2
मैंने केवल इसलिए हस्ताक्षर किए कि मैं आपके उत्तर को उकेर सकूं :)
हरेंद्र सिंह

@Wildcard चूंकि कमांड के विपरीत सरणी बैश सिंटैक्स है, आप इसे परिभाषित कर सकते हैं man bash। एक बार वहां आने के बाद, /Arrays$सरणियों पर अनुभाग पर जाने के लिए टाइप करें। (इसके $बाद की अनुगामी Arraysको अनुभाग के इन-टेक्स्ट संदर्भों के माध्यम से साइकिल चलाने से रोकना है।) वहां से आप fएक पृष्ठ को आगे बढ़ाने या bपीछे जाने के लिए टाइप कर सकते हैं। qकाम पूरा होने पर मैन पेज से बाहर निकलने के लिए टाइप करें।
टेलर एड्मिस्टन

helpयदि आप अधिक देखने के लिए उत्सुक हैं , तो भी, बिना आर्ग के साथ चलने से सभी बैश बिल्ड की सूची होगी।
टेलर एड्मिस्टन

29

localकीवर्ड कई चर ले सकते हैं। एक मूल्य के साथ चर प्रदान करना वैकल्पिक है। आपका उदाहरण दो चर घोषित करता है, cwordऔर wordswordsचर एक खाली सरणी असाइन किया गया है।


18

localबस एक चर को केवल वर्तमान में परिभाषित फ़ंक्शन में गुंजाइश होने की घोषणा करता है, ताकि मुख्य निष्पादन वातावरण मूल्य को "देख" न सके। आप localकिसी फ़ंक्शन के बाहर उपयोग नहीं कर सकते । उदाहरण

func() {
   nonlocal="Non local variable"
   local onlyhere="Local variable"
}
func
echo $nonlocal 
echo $onlyhere

आउटपुट: गैर स्थानीय चर

तो $onlyhereफ़ंक्शन के दायरे के बाहर दिखाई नहीं दे रहा था।


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