mk.. mk.. - 14 days ago 6
Bash Question

Using "printf" in android shell (mksh)

I am porting my shell script (quite big shell script) from bash to android shell (mksh shell).

In mksh shell,

printf
does not seem to be working the same way as it works in bash shell.

Sample code :



PC:~$ cat sample.sh
...
func1()
{
A=100
HEXA=`printf "%04x" ${A}`
echo "A - ${A} HEXA - ${HEXA}"
}

func1


This function's output is as follows.

On bash :



PC:~$ ./sample.sh
A - 100 HEXA - 0064


On Android Shell (mksh)



root:/ # sample.sh
A - 100 HEXA - 300000078


It is printing a really weird number.

I saw from other posts and from the makefile of mksh that printf is not recommended to be used in mksh. My shell script, which is quite big, is using it very heavily. So, I want to handle this somehow. What are my options to handle this? Either a perfect solution or a hack, both would do for me.

Answer

Fixing printf in toybox is great.

But in case anyone would like to print out a number converted to hex (or pretty much any other reasonable base from 2 to 36 if they would be so inclined) on an unrooted device with the old toybox (or no toybox at all) - here is a way how to do it using typeset built-in of mksh:

baseconv(){ typeset -Ui${3:-16} -Z35 x=$1; echo ${x: -${2:-8}};}

func1()
{
    A=100
    HEXA=$(baseconv $A 4 16)
    echo "A - ${A} HEXA - ${HEXA}"
}

or just make a specific function for the printf "%04x" case:

printf04x(){ typeset -Ui16 -Z7 x=$1; echo ${x: -4};}

func1()
{
    A=100
    echo "A - ${A} HEXA - $(printf04x $A)"
}
Comments