Czy ktoś może mi wyjaśnić, dlaczego liczba z wiodącym 0 daje to zabawne zachowanie?
#!/bin/bash
NUM=016
SUM=$((NUM + 1))
echo "$NUM + 1 = $SUM"
Wydrukuje:
016 + 1 = 15
echo $((016))
Czy ktoś może mi wyjaśnić, dlaczego liczba z wiodącym 0 daje to zabawne zachowanie?
#!/bin/bash
NUM=016
SUM=$((NUM + 1))
echo "$NUM + 1 = $SUM"
Wydrukuje:
016 + 1 = 15
echo $((016))
Odpowiedzi:
Nieporozumienie polega na tym, że liczby nie oznaczają tego, czego oczekujesz.
Początkowe zero oznacza liczbę o podstawie 8. Ie 016
jest taka sama jak 8#16
. Jeśli chcesz zachować wiodące zero, potrzebujesz 10#016
.
> num=016
> echo $((num))
14
> echo $((10#$num))
16
Dlatego:
~$ echo $((NUM))
14
jeśli liczba zaczyna się od 0, uważa się ją za wartość ósemkową, a 16 w liczbie ósemkowej to 14 w systemie dziesiętnym.
printf "%03d\n" 10
jest całkowicie użyteczny w bash, aby uzyskać wiodące zero dla nazw plików i tym podobne.