首页 > 解决方案 > Grep 并不总是从文件中找到正确的值

问题描述

我正在尝试#define从头文件中提取两个值C以在 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_VERSION file); $(echo ${var//[$'\t\r\n']} | cut ...无济于事。

我尝试使用 awk 而不是 cut 但得到了相同的结果。

我将命令中的错误重定向到标准输出($(grep $1 file | cut -d ' ' -f 3 2>&1)但没有得到任何额外的信息

我将命令拆分为greppart 和 a cutgrep永远不会错过,但cut随机的输出会给出一个空字符串作为输出。

我仍然不知道这5是从哪里来的,在标准输出或标准输出中没有任何内容cutawk手册。5

标签: shellawkgrepcut

解决方案


推荐阅读