Bash同时循环sed替换

Bash同时循环sed替换,bash,sed,while-loop,Bash,Sed,While Loop,我这里有个奇怪的问题。我想我99%在那里。在尝试执行以下操作时,我只是在某个地方出现了一个小的语法和/或逻辑错误: 所以我有一个清单文件,里面有一堆MD5和。别担心,这些金额只是为了比较,不是为了安全。该文件如下所示: puppy.cfg=324327437483274834783204723 kitty.cfg=7893703274r0327403247032472 etc. function MANIFEST.CHECK { local IDA="$1" local SUMA=$(

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

所以我有一个清单文件,里面有一堆MD5和。别担心,这些金额只是为了比较,不是为了安全。该文件如下所示:

puppy.cfg=324327437483274834783204723
kitty.cfg=7893703274r0327403247032472
etc.
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
调用“Manifest”函数并传递一个值。它会被传递一个称为ID(IDA)的文件名。然后,该函数计算该文件的当前和(IDA)。然后它查看清单文件中的每一行,直到找到匹配的文件ID(IDA=IDB)。当它找到匹配的ID时,会将当前总和与清单文件中的总和进行比较(SUMA vs 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
函数清单.CHECK{
本地IDA=“$1”
本地SUMA=$(md5sum$1 |切割-d'-f 1)
边读边做
本地IDB=“`echo$LINE | cut-d”=”-f1`”;
本地SUMB=“`echo$LINE | cut-d”=“-f2`”;
如果[“$IDA”=“$IDB”];则
如果[!“$SUMA”=“$SUMB”];则
边读边做
sed“s%$SUMB%$IDA\=$SUMA%”变量/清单

完成<如果我理解正确,那么您可以将内部
while
循环替换为单个
sed
,如下所示:

puppy.cfg=324327437483274834783204723
kitty.cfg=7893703274r0327403247032472
etc.
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
函数清单.CHECK{
本地IDA=“$1”
本地SUMA=$(md5sum$1 |切割-d'-f 1)
边读边做
本地IDB=“`echo$LINE | cut-d”=”-f1`”;
本地SUMB=“`echo$LINE | cut-d”=“-f2`”;
如果[“$IDA”=“$IDB”];则
如果[!“$SUMA”=“$SUMB”];则
sed-i“s%$SUMB%$SUMA%”变量/清单
echo“文件不同。”
返回
fi
fi

完成<刚刚检查,您是否希望sed“就地”更改文件(如编辑器)?它没有;它只是将修改后的副本发送到stdout。这解释了为什么我看到了“mashed”输出。嗯,我不知道从这里开始该怎么做。您建议如何替换文件中的一行。