"फू बार में" बिना "पाश" के लिए बैश करें


25

मैं हाल ही में कुछ कोड को देख रहा था जिसने मुझे भ्रमित किया क्योंकि यह काम करता है और मुझे इसकी उम्मीद नहीं थी। कोड इस उदाहरण के लिए कम कर देता है

#!/bin/bash
for var;
do
  echo "$var"
done

जब कमांड लाइन के तर्क के साथ उन्हें प्रिंट किया जाता है

$ ./test a b c
a
b
c

यह वह है, जो कि (मेरे लिए) अप्रत्याशित है। varअपरिभाषित होने के कारण त्रुटि क्यों नहीं होती है? क्या इसे 'अच्छा अभ्यास' माना जाता है?

जवाबों:


27

forयदि कोई in value1 value2...बॉर्न-जैसे गोले में कोई भाग निर्दिष्ट नहीं किया गया है तो स्थितिगत मापदंडों पर लूप लूप करें ।

70 के दशक के उत्तरार्ध से बॉर्न शेल में यह पहले से ही मामला था, हालांकि बॉर्न शेल में, आपको इसे छोड़ना होगा ;(आप for i doकुछ पुराने ऐश संस्करणों को छोड़कर जहां आपको पहले एक नई पंक्ति की आवश्यकता है do) का उपयोग कर सकते हैं ।

देखें कि लूप के लिए बैश में "डू" कीवर्ड का उद्देश्य क्या है? अधिक आश्चर्यजनक रूपांतरों सहित अधिक जानकारी के लिए।

करते हुए:

for i
do
  something with "$i"
done

अच्छा अभ्यास है। यह आमतौर पर समकक्ष की तुलना में थोड़ा अधिक पोर्टेबल / विश्वसनीय है:

for i in "$@"; do
  something with "$i"
done

जिसके लिए बॉर्न शेल, ksh88 के पास कुछ शर्तों के तहत कुछ मुद्दे हैं (जैसे $#कि बॉर्न शेल के कुछ संस्करणों में जब 0 होता है (जो ${1+"$@"}इसके बजाय "$@"काम कर सकता है) या जब $IFSबॉर्न और ksh88 में स्पेस कैरेक्टर नहीं होता है), या जब nounsetविकल्प सक्षम है $#सहित कुछ गोले के कुछ संस्करणों में 0 हैbash ( फिर से साथ ${1+"$@"}के रूप में एक काम के आसपास )।


मेरे दिमाग को शुरू में
तीन

20

यह डिफ़ॉल्ट व्यवहार है, हाँ। यह में प्रलेखित है helpकी forकीवर्ड:

terdon@tpad ~ $ help for
for: for NAME [in WORDS ... ] ; do COMMANDS; done
    Execute commands for each member in a list.

    The `for' loop executes a sequence of commands for each member in a
    list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
    assumed.  For each element in WORDS, NAME is set to that element, and
    the COMMANDS are executed.

    Exit Status:
    Returns the status of the last command executed.

इसलिए, जब आप यह पुनरावृति करने के लिए एक सूची से अधिक देना नहीं है, इस पर पुनरावृत्ति लागू हो जाएगी $@, स्थितीय मापदंडों के सरणी ( a, bऔर cअपने उदाहरण में)।

और इस व्यवहार को पोसिक्स द्वारा परिभाषित किया गया है इसलिए हां, यह "अच्छा अभ्यास" माना जाता है जहां तक ​​यह जाता है।

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