在shell脚本中创建结构(数据结构)

时间:2011-09-17 04:11:07

标签: linux shell data-structures

我是这个领域的初学者......

我的问题是:如何在shell脚本中创建一个结构(或bash,我不确定区别)

在C中我们可以简单地说:

struct name
{
    __u8 x;
    __u8 y;
    signed short z;
    float t;
    float u;
};

是否有可能在shell中创建与此类似的东西?

为什么?

我需要将一些值复制到/ proc文件中..但我需要确定它们是12个字节,以及它们的顺序,因为我想将它们分配给linux内核中的前一个结构模块

感谢您提供任何有用的答案或提示

2 个答案:

答案 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文件。这个选项将是我的第一选择,因为标题应该注意填充和什么是正确的。