2015-03-21 13 views
12

जहां तक ​​मुझे पता था, [[ और [ कुछ अतिरिक्त विशेषताओं को ध्यान में रखते हुए [[ को ध्यान में रखते हुए अपेक्षा की जा सकती है।[और [[? के बीच octal विस्तार अंतर

$ b=010; echo $((b)) 
8 
$ [[ $b -eq 8 ]]; echo $? 
0 

लेकिन

$ [ $b -eq 8 ]; echo $? 
1 
$ test $b -eq 8; echo $? 
1 
$ [ $b -eq 10 ]; echo $? 
0 

क्यों उत्तरार्द्ध अभिव्यक्ति ड्रॉप करता ऑटो अष्टाधारी रूपांतरण: लेकिन हाल ही में मैं कैसे बैश व्यवहार करता है अष्टाधारी विस्तार में एक विसंगति देखा? -eq जैसे अभिव्यक्ति help test के अनुसार बाश में और के अनुसार "अंकगणित" हैं, और आगे के संदर्भ वाले मैनुअल स्थिरांक के अगले खंड के अनुसार एक प्रमुख शून्य के साथ ऑक्टल के रूप में माना जा सकता है। , यह बीजीय, नहीं अंकगणित रूप test में -eq भाव को दर्शाता है हालांकि POSIX गणित भाव अभी भी अपने ऑक्टल मान के लिए अग्रणी शून्य पूर्णांकों का विस्तार:

POSIX श थोड़ा कम स्पष्ट on the subject है।

क्या कोई दस्तावेज या सबूत है कि यह सुझाव देने के लिए कि [[ और [ के बीच उद्देश्य पर ऑक्टेट विस्तार के लिए भेद बनाता है, या यह केवल एक आकस्मिक विशेषता है?

+0

+1; लेकिन मुझे लगता है कि यद्यपि '-eq' को" अंकगणितीय बाइनरी ऑपरेटर "के रूप में वर्णित किया गया है, इसके तर्क * नहीं * वर्णित अभिव्यक्ति के रूप में वर्णित हैं। इसलिए, उदाहरण के लिए, '[b -eq 10] 'शैल पैरामीटर' $ b' का विस्तार नहीं करता है। इसलिए जब यह निश्चित रूप से उस ऑपरेटर के लिए 10 से 10 के बजाय 8 0 के रूप में इलाज करने के लिए अधिक समझ में आता है, तो मुझे मैन्युअल में कुछ भी दिखाई नहीं देता है जो वास्तव में आपके द्वारा देखे जा रहे व्यवहार के विपरीत है। – ruakh

+2

'[[b -eq 8]]' '((बी == 8)) के समतुल्य प्रतीत होता है '(आप' $ 'को छोड़ सकते हैं)। प्रलेखन ऐसा नहीं लगता है। – choroba

+0

@ चोरोबा अच्छा बिंदु, मुझे यह भी एहसास नहीं हुआ था कि '[[x -eq y]]' एक्स और वाई को '(())' अभिव्यक्तियों की तरह बढ़ाता है। – kojiro

उत्तर

2

[[विस्तारित परीक्षण आदेश के रूप में जाना जाता है और ksh88 के रूप में व्यवहार किया जाता है, तो आप यहां विस्तार पा सकते हैं: http://tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS

इसके अलावा, अगर आप पार्टी में आधार के वाकई # आधार ऑपरेटर का उपयोग कर सकते हैं करने की आवश्यकता है इस तरह:

b=010; echo $((10#$b)) 
10 
b=10; echo $((8#$b) 
8 
b=013; echo $((8#$b)) 
11 
+0

धन्यवाद, मैं इसे इसलिए +1 कर दूंगा क्योंकि टीएलडीपी लिंक वास्तव में मेरे प्रश्न में विसंगति का उल्लेख करता है। उसने कहा, ksh93 स्पष्ट रूप से ऑक्टल नहीं करता है '$ (()) में विस्तार, जो इसे पॉज़िक्स sh से भी हटा देता है। (मेरे पास ksh88 आसान नहीं है, लेकिन शायद इसके साथ कोई टिप्पणी कर सकता है।) – kojiro

+0

ओह अजीब, ksh93 साहित्यिक को प्रमुख ज़ीरो के साथ ऑक्टल के रूप में मानता है, लेकिन विस्तार पर ऐसा नहीं करता है। 'echo $ ((010)) -> 8', लेकिन' x = 010; echo $ ((x)) -> 10'। मैं देख सकता था कि इस व्यवहार को POSIX अनुपालन के रूप में कैसे माना जा सकता है। – kojiro

+0

इस तरह से नहीं, लेकिन यदि आप 'x = 010; echo $ (($ x)) 'आपको 8. –

संबंधित मुद्दे