如何在shell脚本的条件下比较md5哈希值?

时间:2012-06-05 04:56:51

标签: shell

代码下面的问题。

#!/bin/sh

check() {   
    dir="$1"
    chsum1=`find ~/folder -type f -exec cat {} \; | md5` 
    chsum2=$chsum1

    for (( ; 0x$chsum1 == 0x$chsum2;  ))
    do
        echo "hello"
        sleep 10
        chsum2=`find ~/folder -type f -exec cat {} \; | md5`
    done

echo "hello"
#eval $2
}

check $*

目标是:使代码有效。它能做什么?将md5应用于文件夹,然后比较md5值。它维持一个循环,直到值不同(这意味着文件夹上发生了某些事情),因此在md5计算散列后10秒内它应该是不同的,然后代码结束。

两个问题

  1. 请注意,那里有评论。如果取消注释while并注释for,您会注意到代码停止工作。为什么?我尝试了不同的组合,试图让它工作。我用引号括起来,使用-eq,=,==等。没有工作。我怎么能让它与整体一起工作?
  2. 现在代码的方式,如果它运行,那么我得到的输出是:
  3.   

    ((:d41d8cd98f00b204e9800998ecf8427e == 97329acaae00bdf66e30ac53b49e10​​36:基数值太大(错误标记为“97329acaae00bdf66e30ac53b49e10​​36”)

    Thus, how can I fix this is the second question and why this is happening.
    

    谢谢!

3 个答案:

答案 0 :(得分:2)

您对(已更新)发布的代码所遇到的问题是,当for循环有效时,您正在使用while循环。

以下代码适用于我。我只是将for循环更改为while循环。

#!/bin/sh

check() {
        dir="$1"
        chsum1=`find ~/NASAtest -type f -exec cat {} \; | md5`
        chsum2=$chsum1

        while [ $chsum1 == $chsum2 ]
        do
                echo "hello"
                sleep 10
                chsum2=`find ~/NASAtest -type f -exec cat {} \; | md5`
        done

        echo "hello"
        #eval $2
}

check $*

while循环不起作用的原因是因为你在方括号和表达式之间缺少空格。

答案 1 :(得分:1)

您可以通过在值前面放置一个Z并将其作为字符串进行比较来消除对您要比较的变量的格式或类型(对于基数来说太大了)的混淆。

# read or operation to define $file1 & $file2 here ...
  val1=`md5sum ${file1} | awk '{print $1}'`
  val2=`md5sum ${file2} | awk '{print $1}'`
  tmpval="Z${val1}" ; val1="${tmpval}"
  tmpval="Z${val2}" ; val2="${tmpval}"
  if [[ "$val1" -eq "$val2" ]] ; then
    # files are the same, do operation here ..
  fi
done

答案 2 :(得分:0)

  

而[$ chsum1 == $ chsum2]确实执行了一些结束

这需要看起来像这样(包括换行符)

while [ $chsum1 == $chsum2 ]
do
 (perform some stuff)
done

请注意方括号和do / done块周围的空格而不是end