我是shell脚本新手并且无法做到以下事情:
我有这个:
MY_MACR0_VALUE="123ABCD"
我想将其转换为:
#define MY_MACR0_VALUE "123ABCD"
我这样做:
//that string is coming from command line
newvar=$(echo "$1" | tr '=' ' ')
echo "#define $newvar" >> MacroFile.h
我得到了这个:
#define MY_MACR0_VALUE 123ABCD
而不是
#define MY_MACR0_VALUE "123ABCD"
缺少双引号。
如何修复脚本以获得所需的结果?
修改
我也可能在命令行中有一些非值的宏,比如
INCLUDE_SOMETHING
应改为
#define INCLUDE_SOMETHING
所以我不需要改变它们中的任何内容。
答案 0 :(得分:2)
问题是,shell正在删除引号,因此脚本甚至看不到它们。如果转义参数中的引号,则可以使用脚本:
sh script.sh MY_MACR0_VALUE=\"123ABCD\"
或者您可以在脚本中使用此行:
echo "#define $(sed '/=/{s/=/ "/;s/$/"/}' <<< $1)" >> MacroFile.h
答案 1 :(得分:0)
您可以使用sed
。像这样:
sed 's/\([^=]*\)=\(.*\)/#define \1 \2/' <<< "$1"
输出:
#define MY_MACR0_VALUE "123ABCD"
该命令将=
之前和之后的部分获取到单独的捕获组中,并将它们填充到最终字符串中。
答案 2 :(得分:0)
sed
解决方案,
sed 's/^/#define /g;s/=/ /g' <<< "$1"
示例:
$ echo 'MY_MACR0_VALUE="123ABCD"' | sed 's/^/#define /g;s/=/ /g'
#define MY_MACR0_VALUE "123ABCD"
说明:
s/^/#define /g
在首发时添加#define
。
s/=/ /
用空格替换=
符号。
答案 3 :(得分:0)
awk -F "=" '{print "#define",$1,$2}' <<< "$1"
没有显示字段分隔符,因此删除了=
并使用#define打印第一和第二部分