Shell Grep并不总是从文件中找到正确的值
我试图从Shell Grep并不总是从文件中找到正确的值,shell,awk,grep,cut,Shell,Awk,Grep,Cut,我试图从C头文件中提取两个#define值,以便在shell脚本中使用它们。所以我用grep找到它们,然后打印出来。然而,变量有时是空的 // main.h #define DEVICE_NO 1 #define FW_VERSION 1 脚本文件是 #!/bin/bash - read_version() { echo $(grep $1 "$projectdir/Inc/main.h" | cut -d ' ' -f 3-) } device_no=$(read
C
头文件中提取两个#define
值,以便在shell脚本中使用它们。所以我用grep找到它们,然后打印出来。然而,变量有时是空的
// main.h
#define DEVICE_NO 1
#define FW_VERSION 1
脚本文件是
#!/bin/bash -
read_version()
{
echo $(grep $1 "$projectdir/Inc/main.h" | cut -d ' ' -f 3-)
}
device_no=$(read_version "DEVICE_NO")
fw_version=$(read_version "FW_VERSION")
echo "DEVICE_NO = $device_no, FW_VERSION = $fw_version"
因此,预期的结果是:
DEVICE_NO = 1, FW_VERSION = 1
但有时情况会是这样
5
DEVICE_NO = , FW_VERSION = 1
它会随机丢失一个或两个值。头文件没有改变,所以它不是从那里来的
更新
正如我所评论的,我认为windows行结束可能是一个问题,因此我将输出传输到tr
并删除\r
,但这没有任何区别。还尝试了var=$(grep-FW_版本文件)$(echo${var/[$'\t\r\n']}剪切…
无效
我试着用awk代替cut,但得到了同样的结果
我将命令中的错误重定向到标准输出($(grep$1 file | cut-d'-f2>&1)
,但没有获得任何额外信息
我将命令拆分为grep
部分和cut
,grep
从不遗漏,但是cut
的输出随机给出一个空字符串作为输出
我仍然不知道
5
是从哪里来的,在cut
或awk
手册中没有任何东西会将5
抛到标准输出或标准输出中。您使用的引号完全错误。您可以安全地编写读取版本的设备号,而不是读取版本的“设备号”
(但没有理由不在此处使用引号)。但在函数中,必须引用$1
(例如grep“$1”“$projectdir/Inc/main.h”
)。不需要引用文字字符串。必须引用包含变量插值的字符串。(通常)头文件是否有常规的unix换行符?鉴于5是在设备_NO=line之前打印的,这感觉像是一种竞争条件,不知何故,cut
的输出可能会转到stderr。您能否将输出传输到十六进制转储并验证输出中是否没有\r
?这种行为很奇怪。@williampersell感谢您的输入。我根据您的第一条评论更新了脚本,这不是问题(我想这只是最佳实践)。我在windows中使用eclipse,此脚本是后期构建的,因此您是正确的,行尾有\r
。如果这是问题,为什么它会随机工作?