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
。如果这是问题,为什么它会随机工作?