3

代码下方的问题。

#!/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 值。它保持一个循环,直到值不同(这意味着文件夹上发生了某些事情),因此在 10 秒后 md5 计算哈希值应该不同,然后代码结束。

两个问题

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

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

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

谢谢!

4

3 回答 3

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 循环不起作用的原因是您在方括号和表达式之间缺少空格。

于 2012-06-05T05:07:14.847 回答
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
于 2014-01-13T22:20:17.083 回答
0

而 [$chsum1 == $chsum2] 做一些事情结束

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

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

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

于 2012-06-05T05:08:05.223 回答