Note que enquanto $((010)) é requerido pelo POSIX para expandir para 8, vários shells não o fazem por padrão (ou apenas em alguns contextos) a menos que em um modo de conformidade como esse é um recurso você geralmente não quer.
Com zsh , isso é controlado pela opção octalzeroes (desativada por padrão, exceto na emulação sh / ksh).
$ zsh -c 'echo $((010))'
10
$ zsh -o octalzeroes -c 'echo $((010))'
8
$ (exec -a sh zsh -c 'echo "$((010))"')
8
Em mksh , isso é controlado pela opção posix (desativada por padrão):
$ mksh -c 'echo "$((010))"'
10
$ mksh -o posix -c 'echo "$((010))"'
8
No bash, não há opção para desativá-lo, mas você pode usar a sintaxe $((10#010)) ksh para forçar a interpretação em decimal (também funciona em ksh e zsh), embora em bash e mksh -o posix , $((10#-010)) não funciona (tratado como 10#0 - 010 , como você pode ver na expansão de $((-10#-010)) yielding -8 ), você precisa de $((-10#010)) (ou $((- 10#010)) para compatibilidade com zsh que reclama -10 sendo uma base inválida).
$ bash -c 'echo "$((10#010))"'
10
Com ksh93 , compare:
$ ksh93 -c 'echo "$((010))"'
8
$ ksh93 -c '((a = 010)); echo "$a"'
8
com:
$ ksh93 -c 'a=010; echo "$((a))"'
10
$ ksh93 -c 'printf "%d\n" 010'
10
$ ksh93 -c 'let a=010; echo "$a"'
10
$ ksh93 -c 'echo "$((010e0))"'
10
$ ksh93 -o letoctal -c 'let a=010; echo "$a"'
8
Então, pelo menos, se você estiver codificando especificamente para algum desses shells, existem maneiras de contornar essa "má funcionalidade".
Mas nada disso ajudaria ao escrever um script POSIX portátil; nesse caso, você deseja remover os zeros à esquerda, conforme mostrado.