1

我正在将我的 shell 脚本(相当大的 shell 脚本)从 bash 移植到 android shell(mksh shell)。

在 Android 中,printf它的工作方式似乎与在其他 Linux 系统中的工作方式不同。

示例代码:

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

func1

该函数的输出如下。

$ ./sample.sh
A - 100 HEXA - 300000078

它正在打印一个非常奇怪的数字。

我从其他帖子和手册页中mksh看到printf不建议在mksh. 我的 shell 脚本非常大,正在大量使用它。所以,我想以某种方式处理这个问题。我有什么选择来处理这个问题?

4

2 回答 2

2

Android中的printf链接到玩具箱

root:/ # which printf
/system/bin/printf
root:/ # ls -l /system/bin/printf
lrwxr-xr-x root     shell             2016-11-14 21:02 printf -> toybox

所以问题出在 toybox printf 中。

问题现已修复 - https://github.com/landley/toybox/issues/54

于 2016-11-19T02:11:47.067 回答
2

固定printftoybox很棒的。

但是,如果有人想在旧的(或根本没有)的无根设备上打印出一个转换为十六进制的数字(或几乎任何其他合理的基数,如果他们愿意2的话) - 这是一种方法使用内置的:36toyboxtoyboxtypesetmksh

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}"
}

或者只是为案例制作一个特定的功能printf "%04x"

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

func1()
{
    A=100
    echo "A - ${A} HEXA - $(printf04x $A)"
}
于 2016-11-19T13:49:39.637 回答