我将我的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
中使用Traceback (most recent call last):
File "python", line 20, in <module>
TypeError: string indices must be integers
。我的shell脚本非常庞大,它的使用非常频繁。所以,我想以某种方式处理这个问题。我有什么选择来处理这个问题?
答案 0 :(得分:2)
printf链接到toybox
from tkinter import *
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.init_window()
def init_window(self):
self.master.title("SAMPLE")
self.pack(expand=1)
# create empty `f`
self.f = Frame(self)
self.f.pack(expand=1)
l = Button(self.f, text="Log in", command=self.login)
l.grid(row=1)
def login(self):
# remove old `f`
self.f.destroy()
# create empty `f`
self.f = Frame(self)
self.f.pack(expand=1)
self.var = StringVar()
self.L = {}
l = Label(self.f, text="Enter your code:")
l.grid(row=1, column=0)
e = Entry(self.f, textvariable=self.var)
e.grid(row=1, column=1)
b = Button(self.f, text="Ok", command=self.fun)
b.grid(row=1, column=2)
def fun(self):
# remove old `f`
self.f.destroy()
# create empty `f`
self.f = Frame(self)
self.f.pack(expand=1)
self.L["Code"] = self.var.get()
l = Label(self.f, text="Code: " + self.L["Code"])
l.grid(row=1, column=0)
root = Tk()
root.geometry("700x700")
app = Window(root)
root.mainloop()
所以这个问题最终出现在toybox printf中。
答案 1 :(得分:2)
在printf
中修复toybox
非常棒。
但是如果有人想要打印出转换为 hex 的数字(或几乎任何其他合理的 base 从2
到{{1}如果他们会如此倾向于)在无根设备上使用旧的36
(或者根本没有toybox
) - 这是一种使用{{{}的方法1}}内置toybox
:
typeset
或仅为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}"
}