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에서 완전히 사용하여 파일 이름 등의 선행 0을 얻을 수 있습니다.
Squeezy

@Squeezy 감사하지만 그 부분은 이미 작동했습니다. 실제 문제는 0으로 시작하는 파일 이름을 얻지 못했습니다. 파일 이름이 가장 높은 번호를 찾은 다음 printf "prefix- % 03d.tif"$ SUM을 사용하여 다음 순서로 파일을 작성했습니다.
DeltaLima

8
echo $((016))
Mehrdad

2
참고로, 이는 C, C ++, Javascript 등 많은 프로그래밍 언어에서 적용됩니다.
Paul Draper

답변:


128

오해는 숫자가 기대하는 것을 의미하지 않는다는 것입니다.

선행 0은 밑이 8 인 숫자를 나타냅니다. 즉와 016같습니다 8#16. 선행 0을 유지하려면 다음이 필요합니다 10#016.

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

23
세계에는 10 가지 유형의 사람들이 있습니다. 바이너리를 이해하는 사람, 그렇지 않은 사람, 기본 8 농담을 기대하지 않은 사람 및 5 명의 다른 유형의 사람들.
Jon Story

42

때문에:

~$ echo $((NUM))
14

숫자가 0으로 시작하면 8 진수 값으로 간주되고 8 진수 16은 10 진수 14입니다.


2
그것은 완벽하게
말하고
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.