なぜbashは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ファイル名などの先行ゼロを取得するためにbashで完全に使用可能です。
スクイージー

@Squeezyありがとう、しかしその部分はすでに機能していました。実際の問題は、先頭に0が付いたファイル名を取得していないことでした。printf "prefix-%03d.tif" $ SUMを使用して、ファイル番号が最も大きい番号を見つけて、次のシーケンスを作成していました。
DeltaLima

8
これを行うだけでこれを自分で理解できたことに注意してくださいecho $((016))
-Mehrdad

2
参考までに、これは多くのプログラミング言語(C、C ++、Javascript)に当てはまります。
ポールドレーパー

回答:


128

誤解は、数字はあなたが期待するものを意味しないということです。

先行ゼロは、基数8の数値を示します。016つまり、はと同じ8#16です。先行ゼロを保持する場合は、必要10#016です。

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

23
世界には10種類の人々がいます。バイナリを理解している人、理解していない人、ベース8のジョークを期待していない人、および他の5つのタイプの人。
ジョンストーリー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.