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 2015年

@Squeezy谢谢,但是那部分已经在工作了。实际的问题不是获取前导0的文件名。而是通过使用printf“ prefix-%03d.tif” $ SUM找出具有最高编号的文件名,然后创建下一个顺序文件。
DeltaLima 2015年

8
请注意,您只需要这样做就可以自己解决问题echo $((016))
Mehrdad 2015年

2
仅供参考,在许多编程语言中都是如此:C,C ++,Javascript。
Paul Draper 2015年

Answers:


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为十进制的14。


2
这很合理,并解释了为什么我的脚本会覆盖我的旧文件:-(
DeltaLima 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.