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 .