Bash while loop sed replace

时间:2014-01-04 09:11:20

标签: bash sed while-loop

我这里有一个奇怪的问题。我想我99%。在尝试执行以下操作时,我只是在某处有一个小的语法和/或逻辑错误:

所以我有一个带有一堆MD5总和的清单文件。别担心,总和只是为了比较,而不是安全。该文件看起来像这样:

puppy.cfg=324327437483274834783204723
kitty.cfg=7893703274r0327403247032472
etc.

调用“Manifest”函数并传递一个值。它被传递一个文件名,称为ID(IDA)。然后,该函数计算该文件的当前总和(IDA)。然后,它会查看清单文件中的每一行,直到找到匹配的文件ID(IDA = IDB)。当它找到匹配的ID时,将当前总和与清单文件中的总和(SUMA与SUMB)进行比较。如果没有区别,那么该函数只会关闭并且什么都不做。如果它确实检测到差异,那么函数“应该”用“当前”总和更新清单文件。这部分功能目前无效。它正在做一些奇怪的事情并将变量混合在一起,而不是改变任何东西。我知道我错过了一些简单的事情。有人可以帮忙吗?

function MANIFEST.CHECK {
  local IDA="$1"
  local SUMA=$(md5sum $1 | cut -d ' ' -f 1)
  while read LINE; do
    local IDB="`echo $LINE | cut -d"=" -f1`";
    local SUMB="`echo $LINE | cut -d"=" -f2`";
    if [ "$IDA" = "$IDB" ]; then
      if [ ! "$SUMA" = "$SUMB" ]; then
        while read LINE; do
          sed "s%$SUMB%$IDA\=$SUMA%" var/manifest
        done < <(grep -v '#' var/manifest)
        echo "The file is/was different."
        return
      fi
    fi
  done < <(grep -v '#' var/manifest)
}

### START SCRIPT ###
MANIFEST.CHECK puppy.cfg

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么你可以用这样的while替换内部sed循环:

function MANIFEST.CHECK {
  local IDA="$1"
  local SUMA=$(md5sum $1 | cut -d ' ' -f 1)
  while read LINE; do
    local IDB="`echo $LINE | cut -d"=" -f1`";
    local SUMB="`echo $LINE | cut -d"=" -f2`";
    if [ "$IDA" = "$IDB" ]; then
      if [ ! "$SUMA" = "$SUMB" ]; then
        sed -i "s%$SUMB%$SUMA%" var/manifest
        echo "The file is/was different."
        return
      fi
    fi
  done < <(grep -v '#' var/manifest)
}

我也会做一些其他的改进,并像这样重写脚本:

manifest=var/manifest
function MANIFEST.CHECK {
    local IDA="$1"
    local SUMA=$(md5sum "$1" | cut -d' ' -f1)
    local IDB SUMB
    while read LINE; do
        IFS== read IDB SUMB <<< "$LINE"
        if [ "$IDA" = "$IDB" ]; then
            if [ "$SUMA" != "$SUMB" ]; then
                sed -i "s%$SUMB%$SUMA%" "$manifest"
                echo "The file is/was different."
                break
            fi
        fi
    done < <(grep -v '#' "$manifest")
}
MANIFEST.CHECK puppy.cfg