बश क्यों लगता है: 016 + 1 = 15?


60

क्या कोई मुझे समझा सकता है कि एक अग्रणी 0 के साथ एक संख्या इस अजीब व्यवहार को क्यों देती है?

#!/bin/bash
NUM=016 
SUM=$((NUM + 1)) 
echo "$NUM + 1 = $SUM"

प्रिंट होगा:

016 + 1 = 15


3
Psst: printf "%03d\n" 10फ़ाइल नाम और इस तरह के लिए एक अग्रणी शून्य प्राप्त करने के लिए बैश में पूरी तरह से प्रयोग करने योग्य है।
स्क्वीज़ी

@Squeezy धन्यवाद, लेकिन वह हिस्सा पहले से ही काम कर रहा था। वास्तविक समस्या एक अग्रणी के साथ एक फ़ाइल नाम नहीं प्राप्त कर रही थी। यह पता लगा रहा था कि फ़ाइल नाम उच्चतम संख्या के साथ क्या था और फिर प्रिंटफ "उपसर्ग-% 03d.tif" $ SUM का उपयोग करके अगला-इन-सीक्वेंस बनाया गया।
डेल्टालिमा Delta

8
ध्यान दें कि आप इस बाहर अपने आप समझ गए होंगे सकता है कि सिर्फ ऐसा करकेecho $((016))
Mehrdad

2
FYI करें, यह कई प्रोग्रामिंग भाषाओं में सच है: C, C ++, Javascript।
पॉल ड्रेपर

जवाबों:


128

गलतफहमी यह है कि संख्या का मतलब यह नहीं है कि आप क्या उम्मीद करते हैं।

एक प्रमुख शून्य आधार 8 के साथ एक संख्या को दर्शाता है। Ie 016जैसा है 8#16। यदि आप अग्रणी शून्य रखना चाहते हैं तो आपको आवश्यकता है 10#016

> num=016
> echo $((num))
14
> echo $((10#$num))
16

23
दुनिया में 10 प्रकार के लोग होते हैं। जो लोग द्विआधारी समझते हैं, वे जो नहीं करते हैं, जो आधार 8 मजाक की उम्मीद नहीं कर रहे थे, और 5 अन्य प्रकार के लोग।
जॉन स्टोरी

42

चूंकि:

~$ echo $((NUM))
14

यदि संख्या 0 से शुरू होती है, तो इसे अष्ट मान माना जाता है और अष्टक में 16 दशमलव में 14 है।


2
यह पूरी तरह से स्पष्ट करता है और समझाता है कि मेरी स्क्रिप्ट मेरी पुरानी फाइलों पर क्यों लिखी गई थी :-(
डेल्टा लिमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.