bash为什么认为010是8?


17

bash为什么认为数字010 = 8?

x=010
echo $x
  010
echo $(( x+0 ))
  8
echo $(( x-2 ))
  6

我认为它可能是二进制的,但是010 = 10 =2。那么为什么它得到8,又如何使它认为010 = 10(和010-2 = 8)?


15
领导0告诉它是八进制的。如果你只是做x=10然后echo $((x+0))再表演10。另外,也不需要$在中使用()
Terrance

2
在许多数字解析器中,010之所以表示8 ,是因为0在前面加一个表示八进制,类似于0x在某些语言中表示十六进制。
德里克·朕会功夫

9
在编程时,这实际上是一件重要的事情。在大多数语言中,0会触发八进制,0x十六进制和0b二进制。
塞斯

下注的解释?
蒂姆(Tim)

3
@tim为什么会-不-是8?;-)虽然不是我的不赞成,但可能是因为它太基础了。这是很正常的行为。
Rinzwind

Answers:


42

以a开头的数字序列0被解释为八进制数字。
八进制10=十进制8

若要使bash将其视为十进制数字,请使用以下命令删除前导零或强制十进制:

N=010
N=$((10#$N))

通常,它适用于所有基准,只需将替换为10所需的基准:

N=[base#]n

用两种解决方法来编辑问题。
2015年

1
@Tim这样做,你可以使用$砍最后一个数字,然后$ {N: - } {N%?}用0来代替空白
Random832

@Tim如果是这样,我不知道如何。$ {$ {N%?}:-0}在zsh中有效,但在bash或ksh中无效。(此外,:-在我上面的评论中应该是:-0}
Random832

您应在答案中包括可以用“ 形式[base#] n强制任何基数,其中base是2到64之间的十进制数,代表算术基数,n是该基数中的数字来源:bash ref
djeikyb 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.