我是这个领域的初学者......
我的问题是:如何在shell脚本中创建一个结构(或bash,我不确定区别)
在C中我们可以简单地说:
struct name
{
__u8 x;
__u8 y;
signed short z;
float t;
float u;
};
是否有可能在shell中创建与此类似的东西?
为什么?
我需要将一些值复制到/ proc文件中..但我需要确定它们是12个字节,以及它们的顺序,因为我想将它们分配给linux内核中的前一个结构模块
感谢您提供任何有用的答案或提示
答案 0 :(得分:2)
我可以建议一个更好的工具,Python吗?它安装在大多数Linux系统上,您可以用它编写脚本,只需将相应的shebang放在顶部:
#! /usr/bin/python
或者,
#! /usr/bin/env python
然后使用struct模块将值打包成二进制表示。
#! /usr/bin/env python
import sys, struct
# Convert first 5 arguments
args = [f(arg) for f,arg in zip([int,int,int,float,float], sys.argv[1:])]
sys.stdout.write(struct.pack('BBhff',*args))
相当于,
#! /usr/bin/env python
import sys, struct
x = int(sys.argv[1])
y = int(sys.argv[2])
z = int(sys.argv[3])
t = float(sys.argv[4])
u = float(sys.argv[5])
sys.stdout.write(struct.pack('BBhff',x,y,z,t,u))
可以调用:
./script.py 1 2 3 4.0 5.0 > /proc/somefile...
编辑:或从其他文件中读取:
./script.py `cat args-file` > /proc/somefile...
答案 1 :(得分:1)
您可以使用echo -en
使用bash转储原始字节,例如echo -en "\000\001"
将打印出两个字节:0x00和0x01。所以你只需要知道特定的字节,在shell脚本中将它们编码为八进制值,然后echo -en
将它们作为proc文件。我不认为你试图将bash变量转换为四字节浮点数会有很多运气;如果您需要计算struct
的值,那么bash不是您的最佳选择。我敢打赌,周围的人可以想出办法,但这并不意味着这是正确的做法。
你有Perl,Ruby,Python,PHP吗?它们都具有pack
函数,用于将本机数字塞入字节流中,以匹配C struct
的布局。使用其中任何一个可以进行一些计算,将pack
值转换为12字节格式,然后将它们转储到proc文件中。
另一种选择是编写一个小的C程序:包含相应的标题以获取模块的struct
,填入它,并fwrite
它到您的proc文件。这个选项将是我的第一选择,因为标题应该注意填充和什么是正确的。