将C头文件中的#defines转换为bash变量

时间:2017-11-25 07:38:20

标签: bash awk

我试图找到一种方法来读取包含一些#define&#39的C头文件,并将这些宏转换为可由shell脚本访问的bash变量。

我首先尝试的是:

gcc -E -dM header_file.h|grep '^#define'|awk '{var=$2;$1=$2="";sub(/^[ \t]+/, "");print "export " var "=\"" $0 "\""}' > /tmp/tmp.sh
source /tmp/tmp.sh

哪个有效,但我真的不喜欢我正在生成这个临时文件

我接下来尝试的是类似的,希望摆脱临时文件:

gcc -E -dM  header_file.h|grep '^#define'|awk '{var=$2;$1=$2="";sub(/^[ \t]+/, "");print "export " var "=\"" $0 "\""}' |while read i
do
$i
done

这不起作用,但是......看起来应该有另一种方法来做到这一点,但我无法想到它,而且我很确定一旦有人发布了我&#39我会感到非常愚蠢,但是我仍然很欣赏任何人都可以提供给我指向正确方向的kickstart。

3 个答案:

答案 0 :(得分:3)

一个复杂的解决方案:

#!/bin/bash

source <(\ 
    sed -r '{
        /^#define/!d
        /#define[ \t]*[^ \t]*$/d
        s/[^ \t]*[ \t]*([^ \t]*)[ \t]*(.*)/\1="\2"/
        /(""|\([^\)]*\))/d
    }' <(gcc -E -dM HEADERFILE)
)

,其中

/^#define/!d保持以#define

开头的行

/#define[ \t]*[^ \t]*$/d删除具有空宏定义的行

s/[^ \t]*[ \t]*([^ \t]*)[ \t]*(.*)/\1=\2/创造了平等

,该过程被替换,描述符可以来源。

答案 1 :(得分:1)

eval $(sed -n 's/^#define  *\([^ ]*\)  *\(.*\) *$/export \1=\2/p' file.c)

答案 2 :(得分:1)

source <(...)语法需要Bash 4,不能在Bash 3或更低版本中运行。

使用eval是邪恶的。实际上source - 并不是更好。

这应该是相当安全和便携的:

while read -r def var val; do
    printf -v $var "$val"
done < <(gcc -E -dM header_file.h | grep -E '^#define[ \t]+[a-zA-Z_][0-9a-zA-Z_]+')