वैरिएबल में 1 जोड़ना अपेक्षा के अनुरूप काम नहीं करता (बैश अंकगणित)


16

अगर मैं निम्नलिखित को बैश टर्मिनल में लिखता हूं:

A="0012"
B=$((A+1))
echo $B

मुझे उम्मीद है कि मैं ११ नहीं, १३ प्राप्त करूँगा !!!!!

मैं चारों ओर घूम चुका हूं और मैं इसे बिल्कुल नहीं समझा सकता हूं, या यह बता सकता हूं कि मैं संख्या में वृद्धि कैसे कर सकता हूं। (मैं वास्तव में बी = "0013" के साथ समाप्त करना चाहता हूं और हर बार एक बार वेतन वृद्धि करता हूं क्योंकि मैं इसे अपने बैकअप के लिए उपसर्ग के रूप में उपयोग कर रहा हूं)


2
UNIX पर मूल रूप से उत्पन्न होने वाली किसी भी भाषा पर अग्रणी शून्य से सावधान रहें। इसका सामान्य रूप से अर्थ होता है अष्टक।
जोशुआ

नहीं, आप 1011 बाइनरी नहीं हैं
केन मोलेरुप

जवाबों:


28

ऐसा इसलिए है क्योंकि इसके साथ शुरू होने वाली संख्याओं 0को ऑक्टल द्वारा माना जाता है bash, इसलिए यह ऑक्टल (बेस 8) जोड़ रहा है। इस संरचना के लिए दशमलव जोड़ पाने के लिए, आपको स्पष्ट रूप से आधार को परिभाषित करने या 00पूरी तरह से उपयोग नहीं करने की आवश्यकता है ।

दशमलव के लिए, आधार 10 है, इसके द्वारा निरूपित 10#:

$ A="10#0012"
$ echo $((A+1))
13

5

जवाब पाने के लिए आप इस कमांड को आज़मा सकते हैं:

A="0012"
echo $A + 1 | bc

bcकमांड के बारे में अधिक जानकारी यहां पाई जा सकती है

bc आदमी पृष्ठ:

NAME
       bc - An arbitrary precision calculator language

SYNTAX
       bc [ -hlwsqv ] [long-options] [  file ... ]

DESCRIPTION
       bc is a language that supports arbitrary precision numbers with interactive execution of statements.  There are some similarities
       in the syntax to the C programming language.  A standard math library is available by command line  option.   If  requested,  the
       math  library is defined before processing any files.  bc starts by processing code from all the files listed on the command line
       in the order listed.  After all files have been processed, bc reads from the standard input.  All code is executed as it is read.
       (If a file contains a command to halt the processor, bc will never read from the standard input.)

       This  version of bc contains several extensions beyond traditional bc implementations and the POSIX draft standard.  Command line
       options can cause these extensions to print a warning or to be rejected.  This document describes the language accepted  by  this
       processor.  Extensions will be identified as such.

4
उपयोग echoऔर एक पाइप के बजाय , आप बैश के "यहां स्ट्रिंग" सिंटैक्स का उपयोग कर सकते हैं। : प्रभाव में ही है, लेकिन IMHO "यहाँ स्ट्रिंग" अधिक सुंदर है bc <<< "$A + 1":-)
बाइट कमांडर

एक लिंक के bcअलावा कमांड का एक या दो वाक्य परिचय hereमददगार होगा।
विनयुनुच्स

2

एक वैकल्पिक विधि आपके चर को पूर्णांक के रूप में रखने और अंत में उन्हें एक स्ट्रिंग में बदलने के लिए हो सकती है:

A=12
B=$((A+1))
echo $B
13
C=$( printf '%04d' $B )
echo $C
0013

गणित में पूर्णांकों के साथ काम करने और उत्तर के लिए स्ट्रिंग में बदलने की यह शैली मेरे लिए अधिक सहज है, क्योंकि मुझे मूल प्रोग्रामिंग के लिए उपयोग किया जाता है। मैं सराहना करता हूं कि बैश में C और BASIC जैसी वैरिएबल टाइपिंग नहीं है, लेकिन यह दिखावा मुझे खुश करता है।


यह उस मुद्दे को उजागर करने के लिए एक परीक्षण था जो मेरे पास था। मैं एक अन्य कमांड के आउटपुट को ले कर प्रारंभिक चर को पढ़ता हूं जो टेक्स्ट है और इसमें अग्रणी शून्य है।
रॉबर्ट 3452

आह ... इतिहास हमेशा बताता है कि हम वर्तमान में कैसे पहुंचे।
विनयुनुच्स

@ Robert3452 आप अग्रणी जीरो को भी छीन सकते हैं:A="0012"; A=$((10#$A))
वेजेंड्रिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.