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.