एक युगल अंकगणित संबंधित आदेश, डैश, पोसिक्स शेल, श, वृद्धि


17

जब POSIX शेल में एक चर को बढ़ाते हुए पूर्व / पोस्ट किया जाता है, तो इन दो उदाहरणों के बीच क्या अंतर है। उन्हें ऐसा लगता है कि उनके परिणाम समान होंगे, लेकिन क्या उनका उपयोग अलग तरीके से किया जाएगा? आप कब एक को पसंद करेंगे?

X=$((X+1))

: $((X=X+1))

जवाबों:


18

आपके पहले उदाहरण में, $((X+1))एक्स + 1 की अभिव्यक्ति का मूल्यांकन करता है और परिणाम के लिए फैलता है, जो तब चर को सौंपा जाता है।

दूसरे उदाहरण में, एक से $((X=X+1))वृद्धि X( $((X++))यह भी मान्य और कम है, लेकिन जरूरी नहीं कि शेल द्वारा समर्थित है), फिर नए मूल्य के लिए फैलता है $X, जो अशक्त कमांड के लिए पहला तर्क है :। अशक्त कमांड उसके तर्कों की अनदेखी करती है, और परिणाम को खारिज कर दिया जाता है (साइड इफेक्ट्स के साथ)।

मैं व्यक्तिगत रूप से तीन (अपेक्षाकृत व्यक्तिपरक) कारणों की वजह से पहला रूप पसंद करूंगा:

  • अशक्त आदेश अस्पष्ट और गलत समझा जाता है, जैसा कि इसके अक्सर यहाँ भ्रमित प्रश्नों का विषय है।
  • पहला स्वरूप समग्र शैल व्याकरण के संदर्भ में अधिक स्वाभाविक लगता है, और यहां तक ​​कि पुरानी मूल्यांकन शैली से थोड़ा सा मेल खाता है।
  • पहला रूप स्पष्ट और अधिक संक्षिप्त है और इसमें कोई आदेश शामिल नहीं है।

यदि आप केवल एक कमांड के वातावरण को संशोधित कर रहे थे तो आपको पहले संस्करण का उपयोग करना होगा

X=$((X+1)) /usr/local/bin/something

आपको सीधे तर्क में मूल्यांकन जोड़ने के लिए दूसरे रूप का उपयोग करना होगा:

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

यह वांछित दुष्प्रभाव है, एक पंक्ति बचाता है, और बहुत स्पष्ट है।

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