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

4

我是一位初学者...

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

比如,我们可以在C语言中这样简单地实现:

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

是否可能在shell中创建类似于这个的东西?

为什么呢?

我需要复制一些值到/proc文件中,但我需要确定它们是12字节,并且它们的顺序,因为我想将它们分配给位于Linux内核模块内部的先前结构。

谢谢任何有用的答案或提示。

2个回答

1

我可以建议一个更好的工具来完成这项工作,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
这似乎是个好主意,但问题在于我不知道 Python :( ,而且我的项目需要在周一之前提交。所以,请您能否用我使用的相同变量名来编写代码行...因为我对您的代码中很多东西感到困惑。例如:变量和列表的声明,在哪里应该分配我的变量...还有许多其他东西。非常感谢。 - Yacob
@Yacob,我简化了一下。这样做有帮助吗? - Alex B
是的...这确实很有帮助,但我想再问一件事:如果我想在文件内部分配值,或者(这是我的真正任务)从另一个文本文件中获取值(也许读取每行并将其分配给特定的参数),我该怎么做呢? 再次感谢。 - Yacob
@Yacob,当然可以使用shell从文件中读取参数(每行一个或一行空格分隔)。请参见编辑。 - Alex B
非常好,除了 #! 和解释器之间的空格 :) - Matt Joiner

1

你可以使用echo -en在bash中转储原始字节,例如echo -en "\000\001"将打印出两个字节:0x00和0x01。因此,您只需要知道特定的字节,在shell脚本中将它们编码为八进制值,然后将它们echo -en到您的proc文件中。但我认为如果您需要计算struct的值,将bash变量转换为四字节浮点数可能不会成功;如果您需要计算struct的值,则bash不是最佳选择。我敢打赌这里的某个人能想出一种方法来做到这一点,但这并不意味着这是正确的做法。

您是否有Perl、Ruby、Python、PHP可用?它们都有一个pack函数,用于将本机数字压缩成字节流,以匹配C struct的布局。使用其中任何一种语言,您都可以进行一些计算,将值pack到12字节格式中,然后将它们转储到您的proc文件中。

另一种选择是编写一个小的C程序:包含适当的头文件以获取模块的struct,填充它,然后将其fwrite到您的proc文件中。这个选项应该是我的首选,因为头文件应该会处理正确获取填充等内容。

关于Python的东西,我一点都不了解(我正在使用Ubuntu 11.04)...如果你能为我写一下就太好了,因为我真的没有时间在项目剩余的时间里学习任何东西。对于第二个选择,我认为这是一个非常好的想法,我会尝试一下,但也许我会向你询问其中的一些问题,因为编程不是我的领域,但我需要它来完成我的项目。非常感谢。 - Yacob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接