代码之家  ›  专栏  ›  技术社区  ›  Iain Duncan pujaji

GREP在Travis上的行为与本地不同

  •  1
  • Iain Duncan pujaji  · 技术社区  · 7 年前

    我继承了一个构建脚本,该脚本通过获取已更改的文件列表并确保其上有当前年份的版权声明来检查Travis构建中的版权声明。脚本中让年份变长的部分使用grep提取年份,如下所示:

    GOSRCFILES=($(git diff --name-only origin/master | grep -v vendor | grep '\.go$'))
    for GOFILE in "${GOSRCFILES[@]}"; do
      if grep -q "(C) Copyright" $GOFILE; then
          YEAR_LINE=$(grep -m 1 "(C) Copyright" $GOFILE)
          echo "Year line in ${GOFILE} is '${YEAR_LINE}'"
          YEARS=($(echo $YEAR_LINE | grep -oE '\d{4}'))
          echo "Years is ${YEARS[@]}"
      fi
    done
    

    这在本地(在Mac上)工作正常,但在Travis上运行时会失败。本地输出为:

    Year line in main.go is ' * (C) Copyright IBM Corp. 2017, 2018 All Rights Reserved.'
    Years is 2017 2018
    

    而在Travis上,它打印:

    Year line in main.go is ' * (C) Copyright IBM Corp. 2017, 2018 All Rights Reserved.'
    Years is 
    

    如您所见,它找到了版权行OK,但是提取 YEARS ( YEARS=($(echo $YEAR_LINE | grep -oE '\d{4}')) )因为它失败了。我已经通读了grep的手册页,不明白为什么这个命令的行为会有所不同。

    1 回复  |  直到 7 年前
        1
  •  1
  •   tripleee    7 年前

    逃生 \d 是Perl扩展,通常在 grep 没有其他选项。使用 [0-9] 或者POSIX类 [[:digit:]] 相反。(理解细微的差异;posix依赖于区域设置,但对于travis,区域设置可能是不符合逻辑的。)

    相切地说,如果只使用一次数组,就不要使用数组;而且可以避免第一次使用 格雷普 两次;不要将大写字母用于您的私有变量;引用您的变量;并将诊断结果打印为标准错误。

    for gofile in $(git diff --name-only origin/master | grep -v vendor | grep '\.go$'); do
      if year_line=$(grep -m 1 "(C) Copyright" "$gofile"); then
        echo "Year line in $gofile is '$year_line'" >&2
        years=($(echo "$year_line" | grep -oE '[[:digit:]]{4}'))
        echo "Years is ${years[@]}" >&2
      fi
    done
    
    推荐文章