Sim, em bash
, printf
é a única forma integrada de reformatar um número em uma base diferente e apenas as bases 8, 10 e 16 são suportadas.
Em bash
(ao contrário dos shells como ksh93
ou fish
), usar a substituição de comandos implica em bifurcar um subshell. Você pode usar printf -v
aqui para evitar o subshell (também disponível nas versões recentes de zsh
para print
e printf
( print -f
) que também suporta impressão em matrizes):
printf -v NEWBASE '%#X' "$((BASE + OFFSET))"
(em bash
, ao contrário de zsh
, $((...))
está sujeito à divisão de palavras, por isso é necessário citar para evitar a dependência de $IFS
).
Em zsh
, você pode especificar a base de expansão como parte da sintaxe de expansão aritmética (bases 2 a 36):
$ echo $(([#16] 0xff + 0xff))
16#1FE
$ echo $(([##16] 0xff + 0xff))
1FE
$ echo 0x$(([##16] 0xff + 0xff))
0x1FE
$ echo $(([##2] 0xff + 0xff))
111111110
Com ksh e zsh, você também pode forçar a expansão de uma variável inteira para estar em uma base específica com:
typeset -i 16 NEWBASE
A expansão estará no formato 16#1FE
. O ksh93 suporta bases até 64, zsh
e mksh
até 36.
O printf
builtin do ksh93 suporta o número de saída em bases arbitrárias, bem como com ou sem o prefixo n#
:
$ printf '%..2d\n' 0x1FE
111111110
$ printf '%#..2d\n' 0x1FE
2#111111110
Em ksh93, var=$(printf...)
não bifurca um subshell, sendo tão eficiente quanto bash
' printf -v
.