为什么 bash 会认为:016 + 1 = 15?

Del*_*ima 61 bash

有人可以向我解释为什么带有前导 0 的数字会产生这种有趣的行为吗?

#!/bin/bash
NUM=016 
SUM=$((NUM + 1)) 
echo "$NUM + 1 = $SUM"
Run Code Online (Sandbox Code Playgroud)

将打印:

016 + 1 = 15

Hau*_*ing 128

误解是数字并不意味着您的期望。

前导零表示以 8016为底的数字。即与 相同8#16。如果您想保留前导零,那么您需要10#016.

> num=016
> echo $((num))
14
> echo $((10#$num))
16
Run Code Online (Sandbox Code Playgroud)

  • 世界上有10种人。那些理解二进制的人,那些不知道的人,那些没有期待 8 进制笑话的人,以及 5 种其他类型的人。 (23认同)

fre*_*ini 42

因为:

~$ echo $((NUM))
14
Run Code Online (Sandbox Code Playgroud)

如果数字以 0 开头,则认为它是八进制值,八进制中的 16 是十进制中的 14。

  • 这完全有道理并解释了为什么我的脚本覆盖了我的旧文件:-( (2认同)