我这里有一个奇怪的问题。我想我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
答案 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