বাশ কেন মনে করে: 016 + 1 = 15?


60

কেউ আমাকে ব্যাখ্যা করতে পারেন কেন একটি শীর্ষস্থানীয় 0 সহ একটি নম্বর এই মজার আচরণ দেয়?

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

মুদ্রণ করবে:

016 + 1 = 15


3
পিএসএসটি: printf "%03d\n" 10ফাইলের নাম এবং এগুলির জন্য একটি শীর্ষস্থানীয় শূন্য পাওয়ার জন্য ব্যাশে সম্পূর্ণ ব্যবহারযোগ্য।
স্কেজি

@ স্কিজি ধন্যবাদ, তবে সেই অংশটি ইতিমধ্যে কাজ করছে। আসল সমস্যাটি শীর্ষস্থানীয় 0 দিয়ে কোনও ফাইলের নাম গ্রহণ করা ছিল না এটি ফাইলের নামটি সর্বাধিক সংখ্যার সাথে কী ছিল তা খুঁজে বের করছিল এবং তারপরে প্রিন্টফ "উপসর্গ-% 03d.tif" $ এসইএম ব্যবহার করে পরবর্তী সিকোয়েন্স তৈরি করছিলাম।
ডেল্টলিমা

8
মনে রাখবেন যে আপনি ঠিক এই কাজটি করে echo $((016))
নিজেরাই

2
এফওয়াইআই, এটি অনেকগুলি প্রোগ্রামিং ভাষায় সত্য: সি, সি ++, জাভাস্ক্রিপ্ট।
পল ড্রাগার

উত্তর:


128

ভুল বোঝাবুঝি হ'ল সংখ্যার অর্থ আপনি যা আশা করেন তা বোঝায় না।

একটি শূন্য বেস 8. সঙ্গে একটি সংখ্যা উল্লেখ করে অর্থাত 016হিসাবে একই 8#16। আপনি যদি শীর্ষস্থানীয় শূন্য রাখতে চান তবে আপনার প্রয়োজন 10#016

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

23
বিশ্বে 10 ধরণের লোক রয়েছে। যারা বাইনারি বোঝে, যারা না, যারা বেস 8 রসিকতা এবং অন্যান্য 5 ধরণের লোকের প্রত্যাশা করেননি তারা।
জন গল্প

42

কারণ:

~$ echo $((NUM))
14

যদি সংখ্যাটি 0 দিয়ে শুরু হয় তবে এটি একটি অষ্টাল মান হিসাবে বিবেচিত হবে এবং অষ্টালে 16 টি দশমিক in


2
এটি পুরোপুরি দৃষ্টি নিবদ্ধ করে এবং ব্যাখ্যা করে যে কেন আমার স্ক্রিপ্টটি আমার পুরানো ফাইলগুলি ওভাররাইট করছে :-(
ডেল্টলিমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.