変数に1を追加しても期待どおりに動作しません(Bash算術演算)


16

次をbashターミナルに書き込むと:

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

予想通り13ではなく11になります!!!!!

私は周りをグーグルで調べましたが、それをまったく説明することも、番号を増やす方法を見つけることもできません。(実際にB = "0013"になり、これをバックアップのプレフィックスとして使用するたびに1つずつ増やしたいと思います)


2
UNIXを起源とする本質的にすべての言語で先行ゼロに注意してください。これは通常、8進数を意味します。
ジョシュア

いいえ、あなたは1011バイナリを取得されていません
ケンMollerup

回答:


28

これは、で始まる数値0がで8進数として扱われるbashため、8進数(基数8)の加算を行うためです。この構造に10進数を追加するには、Baseを明示的に定義するか、まったく使用00しない必要があります。

10進数の場合、ベースは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パイプを使用する代わりに、Bashの「here string」構文を使用できます。効果は同じですが、「ここの文字列」のほうが美しいです: bc <<< "$A + 1":-)
バイトコマンダー

リンクbcに加えて、コマンドを1つまたは2つの文で紹介hereすると役立ちます。
WinEunuuchs2Unix

2

別の方法は、変数を整数として保持し、最後に文字列に変換することです。

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

数学で整数を操作し、答えを文字列に変換するこのスタイルは、私がBASICプログラミングに慣れているので、私にとってより直感的です。BashにはCやBASICのような変数の型付けはありませんが、それを装ってうれしいです。


これは、私が抱えていた問題を強調するためのテストでした。テキストであり、先頭にゼロがある別のコマンドの出力を取得して、初期変数を読み取りました。
Robert3452

ああ...歴史は常に私たちが現在に到達した方法を説明しています。
WinEunuuchs2Unix

@ Robert3452先行ゼロを削除することもできますA="0012"; A=$((10#$A))
。– wjandrea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.